Autor | Zpráva | ||
---|---|---|---|
SwimX Profil |
Mám dotaz, který vrací přesně to, co chci:
select * from ( select v.*, r.id rid from result_version v join result r on r.id = v.result_id where v.status != "concept" order by v.datetime DESC ) t group by rid Tedy z tabulek RESULT a VERSION najde nejnovější verzi pro každý result, která není koncept. Nicméně potřebuji tento dotaz bez vnořeného dotazu ve FROM části, protože chci použít doctrine a DQL a toto není možné. Můžu mít jen subquery ve WHERE části (ano, šlo by poslat tento dotaz skrz doctrine, jenže pak se musí hydratovat výsledek, navíc to chci použít uvnitř grid komponenty, která pracuje s query builderem, atd., takže to vážně potřebuji přepsat). Zkoušel jsem různé varianty s having, ale nenapadá mě, jak to napsat. Děkuji za rady |
||
Kajman Profil |
#2 · Zasláno: 10. 11. 2014, 15:33:17
Co si udělat view?
Ale mělo by to jít i způsobem s left joinem (kdysi používaný u mysql, když ještě neuměla vnořené dotazy) - tedy připojit tu samou tabulku se stejním result_id ale vyšším datumem a ty, pro které se nenajdou, jsou nejvyšší. Něco jako SELECT v.* FROM result_version v LEFT JOIN result_version v2 ON v.result_id = v2.result_id AND v.status != "concept" AND v.result_id < v2.result_id datetime WHERE v.status != "concept" AND v2.result_id IS NULL |
||
SwimX Profil |
#3 · Zasláno: 10. 11. 2014, 20:26:01
Kajman:
view je řešením, nenapadlo mě to :( díky tvůj dotaz má na ř.6 chybku, pokud jsi myslel AND v.datetime < v2.datetime, tak výsledky tohoto dotazu jsou jiné, než toho mého, nevrací mi to žádný výsledek pro RESULTY, jejichž nejnovější VERZE je CONCEPT, přitom by to mělo vracet tu poslední ne-koncept verzi i když není nejnovější (resp. i když existují novější koncepty). |
||
Kajman Profil |
#4 · Zasláno: 10. 11. 2014, 21:41:44
Jasně má tam být takto porovnání datetimů. A druhá chyba je o řádek výš, kdy se má status porovnat s aliasem v2.
|
||
SwimX Profil |
#5 · Zasláno: 11. 11. 2014, 11:09:06
Kajman:
Tak to je paráda, to vážně funguje! :-) Mockrát děkuji SELECT v.* FROM result_version v LEFT JOIN result_version v2 ON v.result_id = v2.result_id AND v.status = v2.status AND v.datetime < v2.datetime WHERE v.status != "concept" AND v2.result_id IS NULL |
||
Kajman Profil |
#6 · Zasláno: 11. 11. 2014, 12:28:14
SwimX:
Jen na tom pátém řádku má být AND v2.status != "concept" Špatně jsem to slovně vyjádřil. Verze z [#5] by našla poslední pro každý status v rámci stejného result_id. Pokud není více statusů než concept a ještě jeden, tak o nevadí, jinak to ale bude vracet více řádků pro jedno result_id. |
||
SwimX Profil |
#7 · Zasláno: 13. 11. 2014, 13:56:28
Kajman:
aha jasně, to jsem špatně pochopil, že místo v.status mělo být v2.status. „Pokud není více statusů než concept“ zatím ne, ale bude, to by se mi to pak rozpadlo, díky |
||
Časová prodleva: 9 let
|
0