Autor | Zpráva | ||
---|---|---|---|
Patrikkk Profil * |
#1 · Zasláno: 28. 8. 2013, 21:46:03
Zdravím všechny.
Řeším jeden problém. Mám dvě tabulky. Jedna tabulka reprezentuje zboží. Ve druhé tabulce mám seznam příhozů (jedná se o aukce). Tabulka příhozů má dvě reference, jedna směřuje na zboží, druhá na uživatele. A nastala situace, kdy potřebuji řadit zboží podle nejvyšší nabídky od aktuálně přihlášeného uživatele. S tím, že zboží se stránkuje, jedná se asi o 1200 položek, tudíž je hloupost vše načítat. Tudíž potřebuji složit dotaz na databázi. To se mi částečně podařilo, s tím, že nedokáži to, aby se vypsalo i zboží, ke kterému uživatel nepřihodil. Protože příhozů může být k předmětu více od různých uživatelů, tudíž musím nějakou podmínkou zajistit, aby se brali v potaz jen příhozy od uživatele. Bohužel při použití podmínky mi zmizí prázdné záznamy. Zde je SQL dotaz: SELECT `item`.* FROM `item` INNER JOIN `bid` ON `item`.`id` = `bid`.`item` WHERE (`bid`.`user` = ?) AND (`item`.`start` <= ? AND `item`.`end` >= ?) GROUP BY `item`.`id` HAVING COUNT(`bid`.`id`) >= 0 ORDER BY `bid`.`amount` DESC Najde se nějaký frajer, co by si s tímto problémem poradil? :) |
||
Sir Tom Profil |
Patrikkk:
Použít OUTER JOIN, nicméně ta podmínka WHERE asi "zruší" JOINování. Mělo by stačit podmínku modifikovat ještě o OR něco IS NULL .
|
||
Zechy Profil |
A je nějáký důvod proč konkrétní tabulku nepřipojit pomocí LEFT OUTER JOIN?
|
||
Patrikkk Profil * |
#4 · Zasláno: 28. 8. 2013, 22:58:10
Sir Tom:
Zkusím nad tím zapřemýšlet, děkuji za podnět. Zechy: Tím důvodem je Nette\Database, které má svá omezení a nevím, jak tam takový dotaz vytvořit. |
||
Keeehi Profil |
#5 · Zasláno: 28. 8. 2013, 23:16:01
Patrikkk:
Pokud nevíš, jak na něco s Nette\Database, tak bych se ptal na nette foru. Ne že by tu nebyli lidé, co nette znají, ale tam jsi přímo u zdroje. |
||
Kajman Profil |
Patrikkk:
Tu podmínku na tabulku bid potřebujete dostat z where do on, tedy SELECT `item`.* FROM `item` LEFT JOIN `bid` ON `item`.`id` = `bid`.`item` AND `bid`.`user` = ? WHERE (`item`.`start` <= ? AND `item`.`end` >= ?) ORDER BY `bid`.`amount` DESC Group by není potřeba, pokud má jeden uživatel k jednomu zboží maximálně jeden příhoz. Pokud může mít více příhozů (což je zbytečné), zanechte group by, ale v order by musíte použít funkci max. A použitý having je pravdivý vždy, k ničemu tam není. |
||
Časová prodleva: 11 let
|
0