2016-06-28 6 views
3

Ich bin mir nicht sicher, wie ich das erklären soll, da ich gerade angefangen habe zu lernen, wie MySQL-Abfragen heute auf eine fortschrittlichere Art und Weise verwendet werden. Hier ist, was ich habe:Hinzufügen von Spalten für mehrere Attribute in MySQL

SELECT pa.displayvalue as Brand 
FROM product p 
JOIN categoryheader ch ON ch.templatetype = 0 AND p.categoryid=ch.categoryid AND ch.isactive=1 
JOIN categorydisplayattributes cda ON ch.headerid = cda.headerid AND ch.categoryid = cda.categoryid AND cda.templatetype = ch.templatetype AND cda.isactive=1 
JOIN productattribute pa ON p.productid = pa.productid AND cda.attributeid = pa.attributeid AND pa.localeid = 1 AND pa.isactive =1 
JOIN attributenames an ON pa.attributeid = an.attributeid AND an.localeid = 1 
WHERE p.isactive = 1 AND p.categoryid = 4871 
AND an.attributeid = 113319; 

So habe ich die Abfrage, und buchstäblich alles, was ich tun möchte, ist eine weitere Spalte für das Hinzufügen „und an.attributeid = 113319“

Ich möchte nur hinzufügen eine andere Spalte, aber anstelle von 113319 möchte ich, dass sie die Werte von sagen wir 1762 in eine Spalte daneben zieht.

Also würde Spalte 1 alle Werte haben, die "Und an.attributeid = 113319" zieht, und Spalte zwei würde alle Werte haben, die "Und an.attributeid = 1762" zieht.

Ich habe diese Art von Code zu arbeiten:

SELECT pa.displayvalue as Brand 
FROM product p 
JOIN categoryheader ch ON ch.templatetype = 0 AND p.categoryid=ch.categoryid AND ch.isactive=1 
JOIN categorydisplayattributes cda ON ch.headerid = cda.headerid AND ch.categoryid = cda.categoryid AND cda.templatetype = ch.templatetype AND cda.isactive=1 
JOIN productattribute pa ON p.productid = pa.productid AND cda.attributeid = pa.attributeid AND pa.localeid = 1 AND pa.isactive =1 
JOIN attributenames an ON pa.attributeid = an.attributeid AND an.localeid = 1 
WHERE p.isactive = 1 AND p.categoryid = 4871 
AND an.attributeid = 113319; 

SELECT pa.displayvalue as Type 
FROM product p 
JOIN categoryheader ch ON ch.templatetype = 0 AND p.categoryid=ch.categoryid AND ch.isactive=1 
JOIN categorydisplayattributes cda ON ch.headerid = cda.headerid AND ch.categoryid = cda.categoryid AND cda.templatetype = ch.templatetype AND cda.isactive=1 
JOIN productattribute pa ON p.productid = pa.productid AND cda.attributeid = pa.attributeid AND pa.localeid = 1 AND pa.isactive =1 
JOIN attributenames an ON pa.attributeid = an.attributeid AND an.localeid = 1 
WHERE p.isactive = 1 AND p.categoryid = 4871 
AND an.attributeid = 1762; 

Aber das ist in navicat als zwei getrennte Treffer. Ich möchte, dass beide in einem Ergebnis sind, aber als zwei Spalten statt zwei Ergebnisse mit jeweils einer Spalte.

Wie Sie sehen können, sind alle Zeilen in jedem dieser Selects mit Ausnahme der letzten Zeile identisch.

Ich habe auch das Gefühl, dass es einen besseren Weg gibt, als den ganzen Code zweimal zu verwenden, nur um eine andere Spalte für ein Attributeid zu bekommen. Egal, ich werde nehmen, was ich bekommen kann.

Wenn Sie irgendwelche Vorschläge haben, würde ich es sehr sehr zu schätzen wissen.

+1

Was Sie fragen, ist etwas kompliziert zu tun, und 99.999999999% der Zeit keine gute Idee.Zeilen sollen verknüpfte Datenelemente darstellen, nicht die Zeilen auf einer Seite, auf die Sie einige nicht verwandte Spalten gezeichnet haben. Wenn Sie nach dieser Art von Ausgabe suchen, ist es am besten, sie auf der Anwendungsebene zu behandeln. – Uueerdo

+0

@Uueerdo stimme völlig zu. Ich würde zwei Möglichkeiten hinzufügen, um es auf Anwendungsebene zu behandeln: zwei Abfragen ausführen und die Ergebnisse nebeneinander anzeigen oder eine Zwischenabfrage ausführen, um eine Tabelle zu erstellen, die beide Ergebnisse in einer einzigen Tabelle enthält, wenn die Joins teuer sind, und dann zwei Abfragen gegen diese Tabelle. – qoba

+0

Also diese Zahlen, die ich versuche zu ändern, ziehen Attribute für ein Produkt. So dass eine Nummer den Markennamen für eine Reihe von Produkten zieht, und dann wird diese andere Nummer alle Markentypen ziehen. Ich versuche, eine CSV-Datei zu erstellen, die die Marke und dann den Typ auflistet. Beide sind miteinander verwandt. Wenn dies also ausgezeichnet wäre, wären die Kopfzeilen: "Marke" und "Typ" und dann würde jede Zeile mit der Marke und dem Typ für jedes Produkt gefüllt werden. – DarkMatter

Antwort

1

Wenn Sie das wirklich tun wollen, zum Formatieren oder zum Zweck der Berichterstellung. Dies ist ein Hack, den Sie verwenden würden.

Und die Verwendung von LEFT JOIN würde alle Zeilen aus der linken Tabelle mit den übereinstimmenden Zeilen in der rechten Tabelle zurückgeben. Das Ergebnis ist NULL auf der rechten Seite, wenn keine Übereinstimmung vorliegt.

SELECT p.productid, t2.Type, t1.Brand, t3.Resolution 
FROM product p 
JOIN 
( 
    SELECT p.productid, pa.displayvalue as Brand 
    FROM product p 
    JOIN categoryheader ch ON ch.templatetype = 0 AND p.categoryid=ch.categoryid AND ch.isactive=1 
    JOIN categorydisplayattributes cda ON ch.headerid = cda.headerid AND ch.categoryid = cda.categoryid AND cda.templatetype = ch.templatetype AND cda.isactive=1 
    JOIN productattribute pa ON p.productid = pa.productid AND cda.attributeid = pa.attributeid AND pa.localeid = 1 AND pa.isactive =1 
    JOIN attributenames an ON pa.attributeid = an.attributeid AND an.localeid = 1 
    WHERE p.isactive = 1 AND p.categoryid = 4871 
    AND an.attributeid = 113319 
) t1 ON t1.productid = p.productid 
LEFT OUTER JOIN 
( 
    SELECT p.productid, pa.displayvalue as Type 
    FROM product p 
    JOIN categoryheader ch ON ch.templatetype = 0 AND p.categoryid=ch.categoryid AND ch.isactive=1 
    JOIN categorydisplayattributes cda ON ch.headerid = cda.headerid AND ch.categoryid = cda.categoryid AND cda.templatetype = ch.templatetype AND cda.isactive=1 
    JOIN productattribute pa ON p.productid = pa.productid AND cda.attributeid = pa.attributeid AND pa.localeid = 1 AND pa.isactive =1 
    JOIN attributenames an ON pa.attributeid = an.attributeid AND an.localeid = 1 
    WHERE p.isactive = 1 AND p.categoryid = 4871 
    AND an.attributeid = 1100 
) t2 ON t2.productid = p.productid 
LEFT OUTER JOIN 
( 
    SELECT p.productid, pa.displayvalue as Resolution 
    FROM product p 
    JOIN categoryheader ch ON ch.templatetype = 0 AND p.categoryid=ch.categoryid AND ch.isactive=1 
    JOIN categorydisplayattributes cda ON ch.headerid = cda.headerid AND ch.categoryid = cda.categoryid AND cda.templatetype = ch.templatetype AND cda.isactive=1 
    JOIN productattribute pa ON p.productid = pa.productid AND cda.attributeid = pa.attributeid AND pa.localeid = 1 AND pa.isactive =1 
    JOIN attributenames an ON pa.attributeid = an.attributeid AND an.localeid = 1 
    WHERE p.isactive = 1 AND p.categoryid = 4871 
    AND an.attributeid = 1762 
) t3 ON t3.productid = p.productid 
+0

Das erzeugt 1mil + Datenzeilen, sollte aber nur 27 sein. – DarkMatter

+0

Hier habe ich einen hartcodierten Schlüssel '1' benutzt, wenn Sie nur einen einzelnen Zeilenwert ausgeben. Wenn mehrere Zeilen vorhanden sind, verknüpfen Sie den 'JOIN' mit dem Fremdschlüssel. Ich nehme an, es gibt eine Produkt-ID, die Sie verwenden können. – ydoow

+0

@DarkMatter wird es auch besser sein, wenn Sie Beispieldaten und gewünschte Ausgabe bereitstellen könnten. – ydoow

1

Sie können so etwas wie dieses

... AND an.attributeid IN (113319, 1762)

tun Dies würde Sie zwei Reihen mit einer Spalte zurück.

Wenn Sie Zeilen in Spalten transponieren möchten, wird das etwas komplizierter.

1

Dies wird manchmal als Schlüsselwertspeicher bezeichnet. Sie müssen einige Spiele mit mehreren Joins spielen, um zu tun, was Sie wollen.

wird Dergleichen den Trick

SELECT whatever, 
     attr1.displayvalue attr1, 
     attr2.displayvalue attr2 
    FROM product p 
    LEFT JOIN productattribute attr1 ON p.productid = attr1.productid 
            AND attr1.attributeid = 113319 
            AND attr1.localeid = 1 
            AND attr1.isactive = 1 
    LEFT JOIN productattribute attr2 ON p.productid = attr2.productid 
            AND attr2.attributeid = 1762 
            AND attr2.localeid = 1 
            AND attr2.isactive = 1 

Sie zwei Kopien der Attributtabelle Beitritt am Ende, und die entsprechende Attribut-ID von jedem in der Join-Bedingung auswählen. Sie verwenden den linken Join anstelle des normalen Joins, damit Sie die Zeile auch dann erhalten, wenn das Attribut fehlt.

Ein sehr geläufiges Beispiel dieser Datenorganisation ist die Tabelle wp_postmeta in WordPress.

Verwandte Themen