Autor | Zpráva | ||
---|---|---|---|
Kcko Profil |
#1 · Zasláno: 22. 5. 2018, 15:37:36
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 |
#2 · Zasláno: 22. 5. 2018, 15:58:00
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 |
#4 · Zasláno: 22. 5. 2018, 16:51:13
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 |
#5 · Zasláno: 22. 5. 2018, 16:53:54
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 |
#7 · Zasláno: 22. 5. 2018, 19:44:07
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 |
||
Časová prodleva: 6 let
|
0