Fórum Root.cz

Hlavní témata => Server => Téma založeno: Jiří Taypan 03. 11. 2011, 16:27:46

Název: Select: hodnoty mladší než datum
Přispěvatel: 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
Název: Re: select projektu s datem mladsim nez hodnota
Přispěvatel: to je jedno 03. 11. 2011, 16:42:15
- co jsi treba uz vyzkousel a nezafungovalo?
- http://www.linuxsoft.cz/article.php?id_article=837
Název: Re: select projektu s datem mladsim nez hodnota
Přispěvatel: PCnity 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'

Název: Re: Select: hodnoty mladší než datum
Přispěvatel: Jiří Taypan 03. 11. 2011, 17:38:12
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
Název: Re: Select: hodnoty mladší než datum
Přispěvatel: PCnity 03. 11. 2011, 17:42:38
OMG... LIMIT 0, 1
Název: Re: Select: hodnoty mladší než datum
Přispěvatel: PCnity 03. 11. 2011, 17:44:07
Hovadina... Ty predsa vobec nemas zaujem o pracu. Sa cely cas pytas len na projekt!
Cize ziaden limit, ale SELECT DISTINCT.
Název: Re: Select: hodnoty mladší než datum
Přispěvatel: Jiří Taypan 03. 11. 2011, 17:52:07
díky všem nakonec byla odpovědí akregační fce max
Název: Re: Select: hodnoty mladší než datum
Přispěvatel: KapitánRUM 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!)
Název: Re: Select: hodnoty mladší než datum
Přispěvatel: mslebodnik 04. 11. 2011, 10:52:33
select pid,max(datum) from test where datum > "2011-11-04" group by pid;
Název: Re: Select: hodnoty mladší než datum
Přispěvatel: Jiří Taypan 04. 11. 2011, 11:02:55
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
Název: Re: Select: hodnoty mladší než datum
Přispěvatel: Logik 04. 11. 2011, 14:54:54
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
Kód: [Vybrat]
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
Kód: [Vybrat]
SELECT .... INNER JOIN .... GROUP BY .... HAVING MAX(DATUM) > ....