Autor Zpráva
lukasMK
Profil *
Pěkný den všem. Trápím se s mysql dotazem a prosím o pomoc. Mám dvě tabulky:

tabulka page
id | menu
-----------------------------
5 | 3
4 | 3
8 | 2


tabulka product_pages
product_id | page_id
-----------------------------
2500 | 5
2500 | 4
2400 | 8

page.id = product_pages.page_id
Potřebuji zobrazit product_id všech záznamů, které patří do více než jedné stránky, u které platí menu = 3.
Nevím si s tím rady, pořád to nedělá to co chci. Prosím o pomoc.
Tori
Profil
Asi takhle?
SELECT product_id
FROM product_pages d
INNER JOIN page p ON d.page_id = p.id
WHERE p.menu = 3
GROUP BY product_id
HAVING COUNT(product_id) > 1
lukasMK
Profil *
Děkuji to je ono.
lukasMK
Profil *
Ještě jsem se snažil vytvoři podobný dotaz, kdy mi to zobrazí page.name u případů, kdy do stránky nepatří ani jeden produkt:

SELECT name
FROM page d
INNER JOIN product_pages p 
ON d.id = p.page_id
WHERE d.menu =3
GROUP BY name
HAVING COUNT( page_id ) <1

Tohle ale nefunguje, někam mi asi nedochází jak to má vlastne fungovat.
Vybírám name z tabulky page, připojuji tabulku product_pages. Spojuji id z tabulky page s product_id z tabulky product_pages.
Seřazuji podle názvu a vybírám count u page_id.

Samozřejmě tam je chyba, ale nevím kde.
Tori
Profil
lukasMK:
Vybírám name z tabulky page, připojuji tabulku product_pages
a připojujete ji pomocí INNER JOIN, tzn. ve výsledku budou jen řádky, které existují v obou tabulkách. Při použití LEFT JOIN dostanete všechny odpovídající řádky z tabulky page a pokud nebude nalezen příslušný řádek z druhé tab., bude v sloupcích z druhé tabulky NULL.

Tady bude vhodnější jiný dotaz:
SELECT id, name 
FROM page d
WHERE NOT EXISTS (SELECT * FROM product_pages p WHERE d.id = p.page_id)
ORDER BY name
lukasMK
Profil *
Děkuji mnohokrát, tohle mě nenapadlo.
Kajman
Profil
Při verzi s left joinem není potřeba group by a někdy to je rychlejší než not exists

SELECT name
FROM page d
LEFT JOIN product_pages p 
ON d.id = p.page_id
WHERE d.menu =3 AND p.page_id IS NULL
Tori
Profil
Kajman:
Díky, to jsem si právě nebyla jistá, jak na tom jsou obě verze rychlostně.
Kajman
Profil
Asi budou většinou obdobně rychlé. Jen někdy může být jeden z přístupů rychlejší než druhý.

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: