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
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
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
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
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
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
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

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0