Autor | Zpráva | ||
---|---|---|---|
jirka86 Profil |
#1 · Zasláno: 2. 9. 2016, 10:19:09
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 |
#2 · Zasláno: 2. 9. 2016, 10:36:13
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 |
#3 · Zasláno: 2. 9. 2016, 10:42:14
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 |
#4 · Zasláno: 2. 9. 2016, 10:48:09
Kajman:
Dotaz je naprosto funkční. Nejde mi teď o rychlost, ale možnosti, alternativu... |
||
Kajman Profil |
#5 · Zasláno: 2. 9. 2016, 10:53:49
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 |
#6 · Zasláno: 2. 9. 2016, 11:07:35
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 |
#7 · Zasláno: 2. 9. 2016, 11:26:52
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 |
#8 · Zasláno: 2. 9. 2016, 13:44:53
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 |
#9 · Zasláno: 2. 9. 2016, 13:51:07
A pokud to potřebujete pro staré verze mysql, co nepodporují poddotazy, tak rychlejší budou dva dotazy než ten jeden s left joinem.
|
||
Časová prodleva: 8 let
|
0