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 |
#2 · Zasláno: 20. 7. 2014, 16:43:59
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 |
||
Časová prodleva: 11 let
|
0