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'
Citace od: PCnity kdy 03. 11. 2011, 16:56:36
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;
Citace od: KapitánRUM kdy 03. 11. 2011, 21:18:11
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) > ....