Autor Zpráva
danhill
Profil
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
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
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
Tedy předpokládá to, že poslední změna je největší datum. Sice by se to dalo napsat pro ověřování největšího ID ale bylo by to komplikovanější a tohle je nejvíce podobné tomu o co jsi se snažil.
danhill
Profil
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
Na tyto dotazy by se hodil dvousloupcový index. První sloupec bude code, druhý id nebo datum, dle dotazu.

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:

0