Autor Zpráva
HosipLan
Profil
Zdravím,
potřebuji si ověřit princip jak převést subquery do query která ji obaluje

SELECT r1.col1,r2.col2,r3.col3, t2.col4
FROM (
  SELECT t1.col1, t1.col2, t3.col3
  FROM `tabulka1` AS t1
  LEFT JOIN `tabulka3` AS t3 ON t3.mId = t1.mId
  WHERE t1.polivka = 'slepičí' AND t3.osolena = 1
  LIMIT 10
) AS r1
LEFT JOIN `tabulka2` AS t2 ON r1.col2 = t2.mojeId
WHERE t2.maso = 'telecí'


teoreticky vím jak to přepsat, ale chci mít jistotu, že nato jdu správně

SELECT t1.col1, t1.col2, t3.col3, t2.col4
FROM `tabulka1` AS t1
LEFT JOIN `tabulka3` AS t3 ON t3.mId = t1.mId
LEFT JOIN `tabulka2` AS t2 ON r1.col2 = t2.mojeId
WHERE (t1.polivka = 'slepičí' AND t3.osolena = 1) AND t2.maso = 'telecí'


sakryš, teď mi tam zase chybí Limit ... jde to vůbec přepsat tak, aby se to chovalo stejně? :(
Kajman_
Profil *
Ten limit v první variantě opravdu přepsání stíží. Dotaz může vrátit třeba 5 nebo 50 řádků. Nenapadá mě způsob, jak to přepsat do jednoho dotazu jen s použitím spojení.

Proč to vlastně nemůžete zapsat s poddotazem?
TomášK
Profil
Myslím, že by mohlo fungovat toto (ale netestoval jsem to):
 SELECT t1.col1, t1.col2, t3.col3, t2.col4
FROM `tabulka1` AS t1
LEFT JOIN `tabulka3` AS t3 ON t3.mId = t1.mId
LEFT JOIN `tabulka2` AS t2 ON r1.col2 = t2.mojeId
CROSS JOIN `tabulka3` AS t3b 
WHERE (t1.polivka = 'slepičí' AND t3.osolena = 1) AND t2.maso = 'telecí'
GROUP BY t1.mId, t2.mId, t3.mId
HAVING COUNT(t3b.mId <= t3.mId) <= 10

Varianta s poddotazem bude efektivnější, moje řešení bych nepoužil.
HosipLan
Profil
[#2] Kajman
protože MySQL nepřenáší indexy přes subquery, ještě jednodužší dotaz pak trvá v řádech vteřin

[#3] TomášK
jestli takhle, tak to bude parádní prasárna, to bych se nato radši vykašlal... :(
Kajman_
Profil *
Jaky je ten dotaz, ktery je pomaly? Jaky je jeho explain? Jake jsou dostupne indexy?

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