Fórum Root.cz
Hlavní témata => Server => Téma založeno: Jiří Taypan 03. 11. 2011, 16:27:46
-
Zdravím,
předem se omlouvám za zavádějící předmět, ale líp to popsat par slovy neumim :D
Situace je následovná: mám databázi se dvěma tabulkami:
projekt - pid, nazev
prace - id, pid, jmeno, datum
pid je identifikátor projektu, zbytek je snad jasny.
Každá práce náleží nějakému projektu a projekt může mít více prací.
A teď samotná otázka:
Jak napsat select, který vrátí všechny projekty, jejichž poslední práce je mladší než nějaké datum?
Lámu hlavu si s tím hlavu ale ne a ne na nic přijít. Předem díky za jakoukoli radu.
S pozdravem Jirka
-
- co jsi treba uz vyzkousel a nezafungovalo?
- http://www.linuxsoft.cz/article.php?id_article=837
-
Malo by to imho byt nieco na styl
SELECT `project`.* FROM `prace`
LEFT JOIN `projekt` ON `prace`.`pid` = `projekt`.`pid`
WHERE `prace`.`datum` < 'hodnota'
-
Malo by to imho byt nieco na styl
SELECT `project`.* FROM `prace`
LEFT JOIN `projekt` ON `prace`.`pid` = `projekt`.`pid`
WHERE `prace`.`datum` < 'hodnota'
tady ovšem narazím na to, že potřebuji v klauzuli where pouze nejstarší práci daného projektu a ne všechny
-
OMG... LIMIT 0, 1
-
Hovadina... Ty predsa vobec nemas zaujem o pracu. Sa cely cas pytas len na projekt!
Cize ziaden limit, ale SELECT DISTINCT.
-
díky všem nakonec byla odpovědí akregační fce max
-
Trochu chytřejší člověk by mohl postnout ten finální SELECT, aby ten, který to bude hledat po tobě, našel nějaké řešení. Ale to by jeden chtěl asi moc co? Myslet i na ostatní a ne jen na svou zadek.
KapitánRUM (Někdo musí bejt ten zlej!)
-
select pid,max(datum) from test where datum > "2011-11-04" group by pid;
-
Trochu chytřejší člověk by mohl postnout ten finální SELECT, aby ten, který to bude hledat po tobě, našel nějaké řešení. Ale to by jeden chtěl asi moc co? Myslet i na ostatní a ne jen na svou zadek.
KapitánRUM (Někdo musí bejt ten zlej!)
Kdybych myslel jen na svuj zadek tak jsem nepostnu ani ten max. Pro zajemce, tady je reseni i s vysevetlenim: http://www.linuxsoft.cz/article.php?id_article=901
-
Jenže to je špatně, protože pokud má někdo dvě práce se stejným časem, vrátí to obě, takže se Ti tam budou duplikovat řádky. Pokud teda chceš vypsat i danou práci, todle řešení nejde použít. V tom případě by bylo dobrým řešením použití window functions
WHERE row_number() = 1 OVER ( PARTITION BY project_id ORDER BY datum) AND Datum > ...
Je teda pravda, že na to bys nemoh dělat v mysql, ta to neumí.
Pokud danou práci nepotřebuješ, pak je zas takovýdle vnořování selectů pomalý a drahý, naprosto dostačuje
SELECT .... INNER JOIN .... GROUP BY .... HAVING MAX(DATUM) > ....