Autor Zpráva
jirka86
Profil
Mám 2 tabulky ve vztahu M:N (eshop_nahledy a produkty). 3.tabulka je vazební (produkty_eshop_nahledy)
V eshop_nahledy jsou umístěny produkty. Strukturu tabulek s daty si můžete vygenerovat pastebin.com/hULTjhDy

Potřebuji získat poslední vložený eshop_nahled spolu se všemi produkty. Dokáži to vyřešit subselectem - viz níže. Lze toto vyřešit alternativně bez subselectu? Děkuji

SELECT *
FROM (SELECT * FROM shop_previews WHERE publish < NOW() ORDER BY publish DESC LIMIT 1) as latest
INNER JOIN products_shop_previews psp ON psp.shop_preview_id = latest.id
INNER JOIN products p ON p.id = psp.product_id
juriad
Profil
Nemyslím si, že je to možné. Nebál bych se špatného výkonu tohoto dotazu. Ten poddotaz se provede za použití indexu pomocí jediného přístupu.
Kajman
Profil
Myslím, že bez poddotazu by to šlo (left join na novější náhled a vybrat, které u kterých se nepovedly najít novější náhledy) ale tipuji, že to nebude rychlejší než varianta s poddotazem z faq.

Trochu pochybuji, že uvedený dotaz vůbec funguje.
jirka86
Profil
Kajman:
Dotaz je naprosto funkční. Nejde mi teď o rychlost, ale možnosti, alternativu...
Kajman
Profil
jirka86:
Dotaz je naprosto funkční.

Aha, vy hledáte poslední náhled a všechny produkty, ke kterým patří. To pak ano. Spletl jsem se (často tu chtějí lidé všechny protukty a ke každému jen poslední vložený náhled).

Ano alternativa jde přes left join, ale bude to pomalejší.
jirka86
Profil
Kajman:
Děkuji za radu. Přes LEFT Join se mi nedaří... Pokud byste měl čas, můžete mi sem hodit nástřel? Děkuji.
juriad
Profil
SELECT *
FROM shop_previews sp1
LEFT JOIN shop_previews sp2 ON sp2.publish > sp1.publish AND sp2.publish < NOW()
INNER JOIN products_shop_previews psp ON psp.shop_preview_id = sp1.id
INNER JOIN products p ON p.id = psp.product_id
WHERE sp1.publish < NOW() sp2.id IS NULL

Nejnovější shop_preview v minulosti = takový show_preview, který je v minulosti a pro který neexistuje jiný shop_preview, který je novější, ale stále v minulosti.
Provádí se tu skoro kartézský součin tabulek shop_previews, což je značně neefektivní.
Kajman
Profil
Pokud bude více náhledů odpovídat poslednímu času, tak dotaz z [#7] vrátí všechny. Pro omezení na jeden lze upravit podmínku v left joinu na
(sp2.publish > sp1.publish OR (sp2.publish = sp1.publish AND sp2.id > sp1.id)) AND sp2.publish < NOW()
Kajman
Profil
A pokud to potřebujete pro staré verze mysql, co nepodporují poddotazy, tak rychlejší budou dva dotazy než ten jeden s left joinem.

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: