2016-04-16 14 views
1

haben 3 TabellenMysql Multi verbinden mit Zahl

product_tags

product_id | tag 
___________________ 
50   | new 
50   | blac 
66   | new 
50   | green 
111  | new 
111  | white 

products_to_categories

product_id | category_id 
____________________ 
50   | 69 
50   | 68 
111  | 40 
111  | 70 

Kategorien

category_id | parent_id (parent category id) 
____________________ 
68   | 0 
69   | 68 
70   | 68 

Notwendigkeit Alle Tags nach Beliebtheit (count Produkt) in der Kategorie sortiert 68 und seine alle Unterkategorien (alle Kategorien mit Eltern-ID 68)

mein Start Abfrage

SELECT tag 
FROM product_tags opd 
    LEFT JOIN products_to_categories optc ON optc.product_id = opd.product_id 
    LEFT JOIN categories optx ON optx.parent_id = '68' 
WHERE opd.tag <> '' 
    AND optx.parent_id = '68' 
ORDER BY optc.product_id DESC 

Ergebnis falsches Ergebnis gebe ich brauchen

tags 
_____ 
new (2) 
white (1) 
+1

Wird ein Fehler angezeigt? Deine Frage ist nicht ganz klar ... – Ilja

+0

nein ich habe ein falsches Ergebnis. Meine Frage ist falsch und nicht geben, Tags aus gewählter Kategorie und Kind Unterkategorien –

+0

@SMNat meine angepasst Antwort –

Antwort

1

Tun Sie dies Schritt für Schritt. Verwenden Sie EXISTS oder IN bei der Überprüfung, ob ein Datensatz existiert. Sie möchten Produkt-IDs aus dem Satz von Kategorie-IDs 68 und ihren untergeordneten Elementen:

select tag, count(*) 
from product_tags 
where product_id in 
(
    select product_id 
    from products_to_categories 
    where category_id = 68 
    or category_id in 
    (
    select category_id 
    from categories 
    where parent_id = 68 
) 
) 
group by tag 
order by count(*) desc; 
+0

danke abfrage arbeit –

-2

ich glaube, Sie ein Problem mit Ihren Tabellen haben, weil Sie den Unterschied zwischen den Produkt ID nicht tun kann 50 und 111, so rate ich Ihnen, die category_id in product_tags Tabelle zu verschieben.

+0

Bitte geben Sie ein Beispiel dafür, was Sie meinen, während ich mich bemühe, es zu verstehen. Danke im Voraus. –

+0

Wenn Sie der Tabelle product_tag die Spalte category_id hinzufügen, können Sie folgende Abfrage durchführen: count (*) als tag_counter, tag aus Product_tags where category_id in (Wählen Sie category_id aus Category where category_id = 68 oder parent_id = 68) group by tag - -> und Sie können das gewünschte Ergebnis haben und Sie können die Tabelle product_to_category löschen. – L3y

1

Zuerst war Ihre Join für Kategorien falsch. Es sollte sein:

LEFT JOIN categories optx ON optx.parent_id = optc.category_id 

dann die richtigen count() Sie einen GROUP BY Tag tun soll, erhalten:

SELECT CONCAT(opd.tag, ' (', count(*), ')') 
FROM product_tags opd 
    LEFT JOIN products_to_categories optc ON optc.product_id = opd.product_id 
    LEFT JOIN categories optx ON optx.parent_id = optc.category_id 
WHERE opd.tag <> '' 
    AND optx.parent_id = '68' 
GROUP BY opd.tag 
+0

Es ist unmöglich, zu diesem Zeitpunkt sicher zu sein, aber logisch denke ich, dass der JOIN zwischen Kategorien und product_to_categories auf der category_id und nicht auf der parent_id stehen sollte. –

+0

danke für Hilfe, aber es gibt mir NULL und Fehler _Current Auswahl enthält keine eindeutige Spalte. Gitter bearbeiten, Kontrollkästchen, Bearbeiten, Kopieren und Löschen sind nicht verfügbar. –

+1

@ S.M.Nat Entschuldigung Buddy aber meine Abfrage ist korrekt und funktioniert gut, zumindest gibt es zurück, was Sie gefragt haben. Entweder habe ich es völlig vermisst, was ich bezweifle, oder das Problem ist auf Ihrer Seite. Check this [SQLFiddle] (http://sqlfiddle.com/#!9/3b92d7/2) –

1

Ich denke, Ihr größtes Problem ist, dass Sie mit Ihren Daten und wie sie Stücke zusammen verwechselt werden immer . Ich habe Ihre Abfrage umgeschrieben, indem ich Ihre Aliase entfernt habe, damit Sie deutlich sehen können, was mit Ihren Joins passiert.

SELECT tag, COUNT(*) AS Num 
FROM product_tags 
    LEFT JOIN products_to_categories ON product_tags.product_id = product_to_categories.product_id 
    LEFT JOIN categories ON product_to_categories.category_id = categories.category_id 
WHERE product_tags.tag <> '' AND categories.parent_id = '68' 
GROUP BY tag 
ORDER BY Num DESC 

dann würde ich Ihre Präsentationsschicht verwenden, um die Präsentation Ihrer Daten „Neu (2)“ usw.

hoffen, das hilft zu behandeln.

+0

danke +1. Das hilft mir fast 99%. Der eine fehlt - Ich möchte auch Tags von der Root/Parent-Kategorie erhalten. Ihre großen SQL-Abfrage Ergebnis-Tags aus untergeordneten Kategorien nur –

+0

Ich fand Lösung 'OR categories.category_id =‚68'' –

+0

Diese Antwort ist falsch. Sie versuchen eine äußere Verbindung, was keinen Sinn ergibt. Es würde sogar zu falschen Resultaten führen, wenn Sie sich äußerlich verbunden hätten (Ihre WHERE-Klausel macht Ihre Joins jedoch zu bloßen inneren Joins). Dann denken Sie nicht an Kategorie 68 selbst, sondern nur an ihre Kinder. Und zuletzt zählst du Produkte vielzählig; Wenn ein Produkt zu drei Kinderkategorien von 68 gehört, zählt es dreimal. –