Join posledního řádku z 1:N vztahu
- DefenestrationPraha
- Člen | 127
Mám dvě tabulky tasks
a task_history
ve vztahu
1:N, svázané pomocí foreign keys.
Chtěl bych select-nout nějaké řádky z tasks, ale zároveň ke každému řádku na-JOINovat poslední řádek z tabulky task_history, který splňuje nějaká kritéria.
Co se čistého SQL týče, našel jsem tento příklad v dosti podobné situaci (jen jde o klienty a jejich historii hovorů) na StackOverflow
SELECT c.*,
FROM client AS c
LEFT JOIN client_calling_history AS cch ON cch.client_id = c.client_id
WHERE
cch.cchid = (
SELECT MAX(cchid)
FROM client_calling_history
WHERE client_id = c.client_id AND cal_event_id = c.cal_event_id
Jde něco podobného udělat pomocí Database Exploreru? Nějaké složitější select a where klauzule?
Musí se přitom počítat s tím, že historie dotyčného úkolu je prázdná a nevrátí se žádný řádek.
Editoval DefenestrationPraha (5. 1. 2023 11:29)
- DefenestrationPraha
- Člen | 127
Už mám i přesnou query, kterou bych chtěl přepsat do Database Exploreru. Vypadá takto:
SELECT t., h.id AS h_id, h.start AS h_start, h.planned_end AS h_planned_end, h.end as h_end, h.param1 as h_param1, h.param2 as h_param2, h.param3 as h_param3, h.param4 as h_param4 FROM tasks t LEFT JOIN (SELECT a. FROM task_history a JOIN (SELECT MAX(id) AS id FROM task_history WHERE param1 = ‚Execution‘ GROUP BY task_id) b ON a.id = b.id) h ON h.task_id = t.id WHERE t.id = ?;
Bohužel zatím marně bojuji s joinWhere, group atd., možná se to s nimi udělat vůbec nedá? Zvlášť u toho vnitřního SELECTU mi není jasné, jak jej vnořit.
Jakýkoliv pokus o použití joinWhere(TASK_HISTORY) nebo joinWhere(TASKS) mi řekne, No reference found for $tasks->task_history, i když by to mělo být naopak (task_history referencuje tasks pomocí korektně nastaveného foreign key).
DefenestrationPraha napsal(a):
Mám dvě tabulky
tasks
atask_history
ve vztahu 1:N, svázané pomocí foreign keys.Chtěl bych select-nout nějaké řádky z tasks, ale zároveň ke každému řádku na-JOINovat poslední řádek z tabulky task_history, který splňuje nějaká kritéria.
Co se čistého SQL týče, našel jsem tento příklad v dosti podobné situaci (jen jde o klienty a jejich historii hovorů) na StackOverflow
SELECT c.*,
FROM client AS c
LEFT JOIN client_calling_history AS cch ON cch.client_id = c.client_id
WHERE
cch.cchid = (
SELECT MAX(cchid)
FROM client_calling_history
WHERE client_id = c.client_id AND cal_event_id = c.cal_event_idJde něco podobného udělat pomocí Database Exploreru? Nějaké složitější select a where klauzule?
Musí se přitom počítat s tím, že historie dotyčného úkolu je prázdná a nevrátí se žádný řádek.
Editoval DefenestrationPraha (9. 1. 2023 11:05)
- DefenestrationPraha
- Člen | 127
Jádro pudla je asi v tom, mít možnost dát subquery pro MAX do LEFT JOINu.
Bohužel mi z dokumentace není vůbec jasné, zda něco tak složitého Database Explorer podporuje nebo ne.
Za normálních okolností bych se na to vykašlal a použil query, jenže ta vrací jen Nette\Database\Row a já mám celý kód postavený na ActiveRow, takže se mi nechce přepisovat několik navazujících funkcí a tříd.