vice selectu v doazu – nette database
- tomasnikl
- Člen | 137
Ahoj,
rad bych si od vas nechal poradit pri sestaveni dotazu. Nedari se mi sestavit dotaz, ktery by mel vyber predchozi a nasledujici zaznam z databaze v jednom. SQL by melo vypadat takto:
SELECT
(SELECT * FROM photo WHERE id < 3 ORDER BY id DESC LIMIT 1) AS prev,
(SELECT * FROM photo WHERE id > 3 ORDER BY id ASC LIMIT 1) AS next
a vyuzivam Nette database.
Budu rad za tipy, jak takovyto dotaz za pouziti nette database sestavit.
Diky moc!
- castamir
- Člen | 629
V první řadě bych upravil SQL dotaz, aby vypisoval to, co doopravdy chceš, např. následovně:
SELECT * FROM `photo`
WHERE
id = (SELECT MIN(id) FROM `photo` where id > 3) OR
id = (SELECT MAX(id) FROM `photo` where id < 3)
Nette\Database je jen malá db nádstavba. Myslím, že tak komplikovaný select bude nejlepší zapsat jednoduše metodou query($query_string) třídy Nette\Database\Connection případně jejich potomků.
Další možnost je provést jednoduché 2 dotazy
SELECT * FROM `photo` WHERE id < 3 ORDER BY id DESC LIMIT 1
SELECT * FROM `photo` WHERE id > 3 ORDER BY id ASC LIMIT 1
Tyto jednoduché dotazy lze zapsat v Nette\Database třeba následujícím způsobem
$connection->table("photo")->where("id < ?", 3)->order("id DESC")->limit(1);
$connection->table("photo")->where("id > ?", 3)->order("id")->limit(1);
Výsledky těchto dotazů můžeš spojit a pracovat s nimi v podstatě stejně jako s uceleným dotazem
$result = array();
$result[] = $connection->table("photo")->where("id < ?", 3)->order("id DESC")->limit(1);
$result[] = $connection->table("photo")->where("id > ?", 3)->order("id")->limit(1);
V případě použití továrniček
pak můžeš vynechat $connection->table("photo")
a dotazy
samotné použít i jinde
Editoval castamir (27. 8. 2012 23:14)