Autor Zpráva
Patrikkk
Profil *
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 *
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
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í.

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