Autor | Zpráva | ||
---|---|---|---|
llook Profil |
#1 · Zasláno: 9. 10. 2005, 18:54:48
Na SQL jsem asi levej. Mám tabulku verzí stránek a chtěl bych vybrat nejnovější verzi od každé stránky.
Tabulka vypadá nějak takhle: CREATE TABLE `versions` ( Když vyberu všechno GROUP BY `page_id`, tak sice mám od každé stránky jen jednu verzi, ale ne nejnovější. Potřeboval bych, aby se data před seskupením seřadila. Myslel jsem, že by to mělo jít nějak takhle, ale nejde: SELECT *, MAX(`created`) as 'max_created' FROM `versions` GROUP BY `page_id` HAVING `created`=`max_created`; (Vybere to jenom jednu, tu úplně nejnovější a to je mi na nic.) Věděl bych jak to udělat poddotazem, ale nechci se kvůli tomu odstřihnout od MySQL 4.0.x. Nějaký nápad? |
||
Anonymní Profil * |
#2 · Zasláno: 9. 10. 2005, 19:07:37
GROUP BY `page_id`DESC LIMIT 1
|
||
Kajman Profil * |
#3 · Zasláno: 9. 10. 2005, 19:43:55
Zkus to takhle nějak...
SELECT p.*, MAX(`o.created`) AS 'max_created' FROM `versions`AS o LEFT JOIN `versions` AS p ON `p.idcl`=`o.idcl` GROUP BY `p.page_id`, `p.created` HAVING `p.created`=`max_created`; |
||
llook Profil |
#4 · Zasláno: 9. 10. 2005, 20:32:56
Kajman Díky, ale nějak se mi to nedaří zprovoznit. Zatím jediné čistě SQL řešení na které jsem přišel je přes dočasnou tabulku:
CREATE TEMPORARY TABLE `tmp_versions_count` (`created` DATETIME); |
||
Anonymní Profil * |
#5 · Zasláno: 9. 10. 2005, 21:01:13
v podstate si to mel dobre jen tam mas navic to having
ma to byt takhle SELECT *, MAX(created) FROM versions GROUP BY page_id ; |
||
kaifman Profil |
#6 · Zasláno: 9. 10. 2005, 21:04:03 · Upravil/a: kaifman
to sem byl ja :)
|
||
llook Profil |
#7 · Zasláno: 9. 10. 2005, 21:17:43
To právě ne. Tím získám všechna pole prvního záznamu ve skupině (*) plus hodnotu nejvyššího created v tý skupině (max(created)). Vrátí to například tohle:
+----+---------------------+---------+---------------------+ Mnou požadovaný stav je ten, že created=max(created) |
||
Kajman Profil * |
#8 · Zasláno: 9. 10. 2005, 21:54:37
Tak to je divné, že to nešlo, myslel, jsem že by to tak mělo být :-) A hlásilo to nějaké chyby, nebo to jen vyplivlo nesmysly?
Jinak co tak koukám do manuálu, tak buď také používají u starších verzí temporary tabulku, nebo nějakou fintu max-concate a v komentářích tam jsou pak také nějaká řešení přes join se samosebou. http://dev.mysql.com/doc/mysql/en/example-maximum-column-group-row.htm l |
||
llook Profil |
#9 · Zasláno: 9. 10. 2005, 23:13:07
Ono to neplive nesmysly. Podle čeho by to mělo poznat, že chci ten nejnovější záznam?
Ale ten odkaz mi hodně pomohl, už jsem ztrácel naději. Na základě toho, co tam píše ten Csaba Gabor jsem dal dohromady tohle: SELECT v1.* FROM `versions` AS v1 LEFT JOIN `versions` AS v2 ON v1.`page_id`=v2.`page_id` AND v1.`id`<v2.`id` WHERE v2.`id` IS NULL A když zpětné apostrofy nahradím uvozovkama, tak to funguje i v SQLite. :-) |
||
llook Profil |
#10 · Zasláno: 9. 10. 2005, 23:16:21 · Upravil/a: llook
Teda vlastně takhle, chci to podle `created` a ne podle `id`:
SELECT v1.* FROM `versions` AS v1 |
||
Kajman Profil * |
#11 · Zasláno: 9. 10. 2005, 23:27:27
No mělo to poznat podle HAVING `p.created`=`max_created`, ale možná tam bylo něco špatně :-) Jo to Csabovo řešení je taky fajn, ale nejdou tam pak dělat sum, max, count a tak :-)
Mně se líbilo to jejich řešení, jak sloučili pole pro max s něčím jiným, pak z toho udělali max a pak z toho ořízli ty původní data... to je taky mazec řešení :-) Hlavně že to funguje :-) |
||
llook Profil |
#12 · Zasláno: 10. 10. 2005, 02:24:15
Ta tabulka byl výsledek dotazu bez having, jak mi radil kaifman.
To s tím HAVING vrací něco jiného - jak jsem teď zjistil, vrací jenom unikátní záznamy. U těch totiž vždycky platí created=max_created. To je asi správné chování - nejdřív se s pomocí GROUP BY seskupí a potom pomocí HAVING protřídí. Ale to s tím JOINem funguje bezvadně. |
||
Časová prodleva: 19 let
|
Toto téma je uzamčeno. Odpověď nelze zaslat.
0