h4ppy schrieb:
Habe hier Problem, z.B. ein Artikel kann in 2 oder Kategorie sein, bei der Ausgabe brauche ich aber nur 1, und zwar IRGEND ein, wegen mir auch zufällig.
Du meinst "2 oder _mehr_ Kagegorien", nehme ich an.
Beispiel SCHRAUBEN :
product.product_id 1 , in product_to_category.product_id werden die Kategorien zum artikel definiert. zb. Produkt 1 = ist in Kategorie 59 und 60, und category_description bekommen die Kategorien ein Namen z.b 59 ist Metall und 60 ist Kreuzschlitz
Bei solchen Fragen ist es für uns hilfreich, wenn Du angibst, mit welchem RDBMS Du das ausführen willst.
|
SELECT DISTINCT product.product_id,category_description.name
FROM product,category_description,product_to_category
WHERE product.product_id = product_to_category.product_id
AND product_to_category.category_id = category_description.category_id
|
Bei solcher Abfrage bekomme ich den Artikel 2x angezeigt , weil er in 2 Kategorien sich befindet. Mich interessiert aber nur irgendeine die ich aber vorher nicht kenne.
Ja, "DISTINCT" bringt hier überhaupt nix, weil es ja zu jedem Produkt beliebig viele Kategorie-Namen geben kann.
Es gibt verschiedene Ansätze, die normalerweise darauf hinaus laufen, aus der zu-N-Beziehung in der Abfrage eine zu-1-Beziehung zu machen. Ungetestet:
| WITH product_to_one_category AS (
SELECT product_id, MIN(category_id) AS category_id
FROM product_to_category
GROUP BY product_id
)
SELECT product.product_id, category_description.name
FROM product
JOIN product_to_one_category ON product.product_id = product_to_one_category.product_id
JOIN category_description ON product_to_one_category.category_id = category_description.category_id
|
Hinweis: Ich benutze lieber die JOIN-Syntax, weil die besser den Join betont. Alt sähe es so aus:
| WITH product_to_one_category AS (
SELECT product_id, MIN(category_id) AS category_id
FROM product_to_category
GROUP BY product_id
)
SELECT product.product_id, category_description.name
FROM product, category_description, product_to_one_category
WHERE product.product_id = product_to_one_category.product_id
AND product_to_one_category.category_id = category_description.category_id
|
Man kann das auch old school als Inline-View definieren:
| SELECT product.product_id, category_description.name
FROM product, category_description, (
SELECT product_id, MIN(category_id) AS category_id
FROM product_to_category
GROUP BY product_id
) AS product_to_one_category
WHERE product.product_id = product_to_one_category.product_id
AND product_to_one_category.category_id = category_description.category_id
|
Ciao
robert