Join posledního řádku z 1:N vztahu

DefenestrationPraha
Člen | 110
+
0
-

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 | 110
+
0
-

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 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 (9. 1. 2023 11:05)

DefenestrationPraha
Člen | 110
+
0
-

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.