Doppelte Werte aus Bestellung filtern [MySQL]

HRGS85

Benutzer
Beiträge
23
Hi zusammen,

ich habe folgende Abfrage:

select o.increment_id, o.base_subtotal, i.sku, i.name, i.product_type
from sales_flat_order_item i
join sales_flat_order o on i.order_id = o.entity_id

Ergebnis:
siehe Anhang

Problem:
In der ersten Bestellung (increment_id 431275449) ist der Artikel WTY87701 doppelt drin. Einmal als einzelner Artikel (Zeile 2), einmal als Bundle Artikel (Zeile 1). Der einzelne Artikel sollte jedoch rausgefiltert werden, da er ja schon in dem Bundle steckt. Bundle und Simple Artikel haben immer den gleichen Namen -> siehe Spalte "name".

Jetzt könnte man den Artikel so rausfiltern:
Für jede Bestellung muss geschaut werden, ob es innerhalb dieser Bestellung (also wo die increment_id gleich ist) Zeilen gibt, in denen die Spalte "name" gleich ist. Ist im Beispiel der Fall in Zeile 1 und 2. Dann sollte die Zeile rausgenommen werden in der der product_type gleich "simple" ist. So bleibt dann nur noch der bundle Artikel drin und alles ist gut.

Aber wie schreib ich das in MySQL?

Wäre sehr cool wenn jemand helfen könnte...
 

Anhänge

  • Bsp.jpg
    Bsp.jpg
    53,5 KB · Aufrufe: 12
Werbung:
Hi zusammen,

ich habe folgende Abfrage:

select o.increment_id, o.base_subtotal, i.sku, i.name, i.product_type
from sales_flat_order_item i
join sales_flat_order o on i.order_id = o.entity_id

Ergebnis:
siehe Anhang

Problem:
In der ersten Bestellung (increment_id 431275449) ist der Artikel WTY87701 doppelt drin. Einmal als einzelner Artikel (Zeile 2), einmal als Bundle Artikel (Zeile 1). Der einzelne Artikel sollte jedoch rausgefiltert werden, da er ja schon in dem Bundle steckt. Bundle und Simple Artikel haben immer den gleichen Namen -> siehe Spalte "name".

Jetzt könnte man den Artikel so rausfiltern:
Für jede Bestellung muss geschaut werden, ob es innerhalb dieser Bestellung (also wo die increment_id gleich ist) Zeilen gibt, in denen die Spalte "name" gleich ist. Ist im Beispiel der Fall in Zeile 1 und 2. Dann sollte die Zeile rausgenommen werden in der der product_type gleich "simple" ist. So bleibt dann nur noch der bundle Artikel drin und alles ist gut.

Aber wie schreib ich das in MySQL?

Wäre sehr cool wenn jemand helfen könnte...

Ich denke, da liegt schon mal ein Fehler im Design vor. Egal. Ich hab eine Idee, das in PG zu realisieren: count(1) over (partition by increment_id, name order by case when product_type='bundle' then 0 else 1 end asc) und dann außen rum noch mal nur alle row_number = 1 filtern (untested jetzt). Aber das geht in MySQL nicht. Blöd, gell?
 
Hi.

Meine angepasste Beispieltabelle:
Code:
sqlite> SELECT * FROM HRGS85;
431275449|WTY87701-B-WTY|Bosch WTY87701|bundle
431275449|WTY87701|Bosch WTY87701|simple
431275449|Plus3Wasser|Garantieverlängerung|simple

Unerwünschte lassen sich mit einem join finden:
Code:
sqlite> SELECT A.*
   ...> FROM HRGS85 AS A
   ...> CROSS JOIN HRGS85 AS B
   ...> WHERE A.name = B.name
   ...> AND A.product_type != B.product_type
   ...> AND A.product_type > B.product_type;
431275449|WTY87701|Bosch WTY87701|simple

Diese lassen sich nach SQL92 mit EXCEPT ausschließen:
Code:
sqlite> SELECT * FROM HRGS85
   ...> EXCEPT
   ...> SELECT A.*
   ...> FROM HRGS85 AS A
   ...> CROSS JOIN HRGS85 AS B
   ...> WHERE A.name = B.name
   ...> AND A.product_type != B.product_type
   ...> AND A.product_type > B.product_type;
431275449|Plus3Wasser|Garantieverlängerung|simple
431275449|WTY87701-B-WTY|Bosch WTY87701|bundle

Soweit ich weiß hat MySQL EXCEPT aber nie gelernt. Wie EXCEPT mit Hilfe eines LEFT JOINS simuliert werden kann lasse ich als Übungsaufgabe offen.

Gruß
Hony
 
Werbung:
Man könnte auch mit NOT EXISTS arbeiten, in etwa so:
Code:
SELECT    t1.pk,
        t1.bezeichnung,
        t1.typ
FROM    tabelle t1
WHERE NOT EXISTS (    SELECT    1
                    FROM    tabelle t2
                    WHERE    t2.pk != t1.pk
                    AND        t2.bezeichnung = t1.bezeichnung
                    AND        t2.typ = 'bundle' )
Aber deine increment_id finde ich höchst verwirrend, ist die nicht eindeutig?
 
Zurück
Oben