Autor Zpráva
Petr Ká
Profil
Ahoj, mám 3 tabulky:

users:
- konkrétní uživatelé
sloupce:
user_id    int, autoincrement
login        varchar
pass        varchar
mail         varchar
. . .

plans:
- typy placených účtů
- sloupce:
plan_id    int, autoincrement
name       varchar
price        int

users_plans:
- Zaplacené typy účtů pro období (může jich být víc, zájímá mne pouze aktuální - 'from'>=NOW() AND 'to'<NOW() nebo tak něco)
id              int, autoincrement
user_id     int - reference k tabulce users
plan_id     int - reference k tabulce plans
from         timestamp - zaplaceno OD
to             timestamp - zaplaceno DO

A potřebuji naJOINovat největší zaplacený plán (name, price, ...) v zadaném období k řádku uživatele (SELECT * FROM users WHERE user_id='XXX'). Pokud nebude v daném období žádný uživatelský plán, nejlépe do plan_id hodit '-1', pokud bude nalezen jeden, nebo více v daním období, použít pouze nejvyšší (ORDER BY price DESC LIMIT 1).

funguje to tak, ze pri platbe se do 'users_plans' prida radek na principu (také potřebuji vyřešit jednoduše, bez PHP):

VLOZ DO 'users_plans' HODNOTY: 
   ZADANE_USER_ID AS user_id, 
   ZADANE_PLAN_ID AS plan_id, 
   (VYBER NEJVETSI DATUM Z 'users_plans' WHERE user_id='XXX' LIMIT 1 ) 
         POKUD NULL VLOZ NOW() AS from
         JINAK VLOZ to_co_jsme_nasli,
   POKUD BYLO from NULL
         VLOZ NOW() + 30 dní AS 'to'
   JINAK from + 30 dní AS 'to'

Děkuji
Alphard
Profil
Stačí tato inspirace?
Petr Ká
Profil
Alphard:
Díky, stačila a pomohla. Jen bych ještě teda poprosil, někoho zkušeného o překontrolování, zda je dotaz v pořádku:

SELECT users.`user_id` ,
       users.`login` ,
       users.`email` ,
       ifnull(pu.`plan_id` , -1) AS `plan_id` ,
       ifnull(pu.`name` ,
                ( SELECT `name`
                 FROM `plans`
                 WHERE `price` =0
                 ORDER BY `parent` ASC LIMIT 1)) AS `name` ,
       ifnull(pu.`from` , now()) AS `from` ,
       ifnull(pu.`to` , (now() + INTERVAL 30 DAY)) AS `to`
FROM `users`
LEFT JOIN
  ( SELECT pl.`plan_id` ,
           pl.`user_id` ,
           plany.`name` ,
           pl.`from` ,
           pl.`to`
   FROM `users_plans` pl
   JOIN
     ( SELECT plans.`name` ,
              plans.`id` ,
              plans.`price`
      FROM `plans`)plany ON pl.`plan_id` = plany.`id`
   WHERE pl.`user_id` = '1515'
     AND pl.`from` <= now()
     AND pl.`to` > now()
   ORDER BY plany.`price` DESC LIMIT 1)pu ON pu.`user_id` = users.`user_id`
WHERE users.`user_id` = '1515'



Pro lepší znázornění a s nějakýma datama jsem to hodil na Fiddle http://sqlfiddle.com/#!2/648a4/1

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0