Autor | Zpráva | ||
---|---|---|---|
danhill Profil |
#1 · Zasláno: 17. 11. 2020, 09:21:28
Ahoj,
žádám o pomoc s dotazem, pro vás to bude hračka, já nejsem schopen to sestrojit... Mám tabulku A s daty a pak tabulku B s údaji kdy a co se změnilo v tabulce A Spojovatel mezi tabulkami je sloupec code. Nyní potřebuji do selectu z tabulky A přidal sloupec s datem poslední změny. Zkouším něco takového: SELECT a.*, b.date_change FROM data a LEFT JOIN archiv b ON a.code = (SELECT b.date_change FROM archiv bb WHERE bb.code = a.code ORDER BY bb.id DESC LIMIT 1) Ale když tento dotaz aplikuji v phpMyAdmin, tak se jen kroutí a kroutí dokud nevyprší časový limit ... Takže tam evidentně mám něco blbě. Další věc se kterou si nejsem jistý, že záznam v tabulce A vůbec nemusí mít žádný záznam v tabulce B, takže nevím zda LEFT JOIN je správná volba. Děkuji moc. |
||
Kajman Profil |
#2 · Zasláno: 17. 11. 2020, 19:38:09
Pokud chcete jen jeden sloupec, tak bych ten poddotaz dal přímo do selectu.
SELECT a.*, (SELECT bb.date_change FROM archiv bb WHERE bb.code = a.code ORDER BY bb.id DESC LIMIT 1) date_change FROM data a |
||
Keeehi Profil |
#3 · Zasláno: 17. 11. 2020, 22:42:00
Jen doplním, že to jak jsi to zamýšlel by správně vypadalo takto
SELECT a.*, b.date_change FROM data a LEFT JOIN ( SELECT code, max(date_change) AS date_change FROM archiv GROUP BY code ) b ON a.code = b.code |
||
danhill Profil |
#4 · Zasláno: 18. 11. 2020, 09:38:55
Perfektní, na vás tady ohledně mysql je prostě vždy spoleh.
Obě varianty fungují. Ta druhá se mi líbí asi více. Obě ty tabulky jsou již dost veliké ( řádově 100k řádků). Takže join na změnu jej prodlouží cca o 0,5s , takže výsledek dostanu za cca 2s, což je teda dost na hraně snesitelnosti. Klíče a indexy mám myslím nastaveny správně, no zkusím s tím ještě polaborovat, možná pomůže když dám index ještě na ten datum, uvidíme. Mockrát děkuji. |
||
Kajman Profil |
#5 · Zasláno: 18. 11. 2020, 10:24:24
Na tyto dotazy by se hodil dvousloupcový index. První sloupec bude code, druhý id nebo datum, dle dotazu.
|
||
Časová prodleva: 3 roky
|
0