Autor Zpráva
Kcko
Profil
Už jsem delší dobu nepsal složitější SQL dotazy a nemůžu vymyslet následující:

hlavní tabulka má pro zjednodušení jen increment ID, vazební tabulka ukládá 4 odlišné datumy (tj 4 řádky ke každé registraci).
Moje představa výstupu
id | datum (nejstarší) | datum (nejstarší + 1) | datum (nejstarší + 2) | datum (nejstarší + 3)


registration_json
===========
id

registration_total_controls
===================
id | registration_json_id) | datum
id | registration_json_id) | datum
id | registration_json_id) | datum
id | registration_json_id) | datum


Korelovaný dotaz vyhodí, že nezná v JOINU sloupeček z nadřazené tabulky. Nevím jak moc to řešit.

Díky za nějaké nakopnutí.
Kajman
Profil
Mysql tuším umožňuje jen jedno zanoření. Pokud je poddotaz v korelovaném dotaze, tak ten tuším na sloupce z hlavního dotazu už nevidí.
Kcko
Profil
Kajman:
Asi dělám něco blbě, protože mi nejde ani 1 zanoření.
Jak by to mělo vypadat?


Je to něco jako

SELECT
a.*
FROM a
LEFT JOIN (SELECT * FROM b JOIN a ON b.neco = a.neco LIMIT 1) x ON x.neco= a.neco
Kajman
Profil
V této části to mysql nepodporuje. V select části si zkus vypsat primární klíč a celé to obalit a teprve udělat join.
Kcko
Profil
Kajman:
Zkoušel jsem ten hlavní select obalit do dalšího a k tomu to připojit, taky to samé. Nic, udělám to v aplikační vrstvě, děkuji alespoň za utvrzení, že to skutečně nešlo.
Radek9
Profil
Kcko:
Ono to jde nějak takhle:
SELECT 
a.*,
(SELECT b.datum FROM b WHERE b.registration_json_id = a.id ORDER BY b.datum ASC LIMIT 1 OFFSET 0) AS datum_0,
(SELECT b.datum FROM b WHERE b.registration_json_id = a.id ORDER BY b.datum ASC LIMIT 1 OFFSET 1) AS datum_1,
(SELECT b.datum FROM b WHERE b.registration_json_id = a.id ORDER BY b.datum ASC LIMIT 1 OFFSET 2) AS datum_2,
(SELECT b.datum FROM b WHERE b.registration_json_id = a.id ORDER BY b.datum ASC LIMIT 1 OFFSET 3) AS datum_3
FROM a

Ale není to úplně hezké. Porovnej, jestli je to rychlejší než zpracování dat v aplikační vrstvě.
Kcko
Profil
Radek9:
Ahoj, dík, vím, že to takhle jde.
Pro zjednodušení jsem to napsal blbe, stejně potřebuju ty řádky připojit 4x jako 4x tabulky, protože potřebuju těch sloupečků víc, ne jen datum.

Mohl bych ještě použít CONCAT/CONCAT_WS, ale bude to zase 1 sloupeček oddělený separátorem a to taky není ono.
Kajman
Profil
Když použiješ Radkův dotaz, ale místo datumu vyzobneš id a obalíš to, tak přes nalezená id můžeš tu tabulku 4x připojit.

Nebo přejít na mysql 8 nebo mariadb verze 10.2 a novější a použít window funkce.
Kcko
Profil
Kajman:
Máš pravdu. Už mi to docvaklo, díky za finální popostrčení.
Radek9:
Díky za nápovědu.

Vypadá to tedy nějak takto a zdá se, že to funguje.


SELECT
tmp.*,
x1.aid, x1.datum_doporucene_kontroly, x1.datum_uskutecnene_kontroly,
x2.aid, x2.datum_doporucene_kontroly, x2.datum_uskutecnene_kontroly,
x3.aid, x3.datum_doporucene_kontroly, x3.datum_uskutecnene_kontroly,
x4.aid, x4.datum_doporucene_kontroly, x4.datum_uskutecnene_kontroly

FROM (
    
   SELECT 
    t1.*,
    (SELECT a1.aid FROM registration_total_controls a1 
     WHERE a1.registration_json_id = t1.id 
     ORDER BY a1.datum_doporucene_kontroly 
     LIMIT 1 OFFSET 0
     ) x1,
     (SELECT a1.aid FROM registration_total_controls a1 
     WHERE a1.registration_json_id = t1.id 
     ORDER BY a1.datum_doporucene_kontroly 
     LIMIT 1 OFFSET 1
     ) x2,
      (SELECT a1.aid FROM registration_total_controls a1 
     WHERE a1.registration_json_id = t1.id 
     ORDER BY a1.datum_doporucene_kontroly 
     LIMIT 1 OFFSET 2
     ) x3,
       (SELECT a1.aid FROM registration_total_controls a1 
     WHERE a1.registration_json_id = t1.id 
     ORDER BY a1.datum_doporucene_kontroly 
     LIMIT 1 OFFSET 3
     ) x4
    
   FROM registration_json t1
    WHERE t1.id = 70239

) tmp

JOIN registration_total_controls x1 ON x1.aid = tmp.x1
JOIN registration_total_controls x2 ON x2.aid = tmp.x2
JOIN registration_total_controls x3 ON x3.aid = tmp.x3
JOIN registration_total_controls x4 ON x4.aid = tmp.x4

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: