vice selectu v doazu – nette database

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
tomasnikl
Člen | 137
+
0
-

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
+
0
-

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)

tomasnikl
Člen | 137
+
0
-

Super, dekuju..

zatim to mam resene jako 2 dotazy, ale jdu si to prepsat. Jeste jednou diky!

a jeste jeden dotaz, pouziti MIN a MAX je lepsi nez muj 1. zapis? Da se rict, ze dotaz bude rychlejsi?