MySql-Entsprechung MINUS (UNION) ?

parabool

Bekanntes Mitglied
Hallo,

Gibt es eigentlich im Mysql-Dialekt einen Operator bzw. eine Möglichkeit ähnlich "MINUS" ?
Unten stehendes Bsp. (vereinfacht) addiert die Counter je Artikel aus beiden per UNION ALL verbundenen Abfragen.
Ich brauche aber eine Subtraktion.

SQL:
SELECT artikel,COUNT(*) FROM
(
 SELECT artikel  FROM table
 WHERE attr1 = 1 AND attr = test1'
 UNION ALL
 SELECT artikel  FROM table
 WHERE attr1 = 2 AND attr = test2'
)
 AS a WHERE attr3<>'0' GROUP BY artikel;


Vielen Dank.
 
Zuletzt bearbeitet:
Danke für die Anwort - funktioniert aber nicht, habe das Problem wahrscheinlich nicht richtig beschrieben.

Ein Bsp.:
Ergebnis der ersten Abfrage:
Artikel | count(*)
a |3
b |9
c |5

Ergebnis der zweiten Abfrage:
Artikel | count(*)
a |2
b |1
c |4

Meine obige Abfrage (erste und zweite per Union verbunden) würde folgendes liefern (Addition):
Artikel | count(*)
a |5
b |10
c |9

Ich brauche Substraktion, wo das Ergebnis die so ausehen würde

Artikel | count(*)
a |1
b |8
c |1
 
Zuletzt bearbeitet:
Bilde einen Query mit zwei Subqueries für deine beiden Szenarien und verknüpfe die Tabellen. Die Mengen kannst du entsprechend dann mit Minus verrechnen.

[sql]
Select abfrage1.artikel, (abfrage1.anzahl - abfrage2.anzahl) as anzahl
from (
select artikel, count(*) as anzahl from tabelle1
) as abfrage1,
(
select artikel, count(*) as anzahl from tabelle2
) as abfrage2
where abfrage1.artikel = abfrage2.artikel
[/sql]

Wenn du uns mehr Informationen gibst wie deine Tabellen aufgebaut sind lässt sich das u.U. auch besser erklären 😉
 
Also so ganz verstehe ich ja nicht, wie die von dir angegebene Ergebnissmenge bei einem MINUS rauskommen soll.
Ein MINUS Query liefert die Ergebnisse des 1. Query welche nicht auch im 2. Query auftauchen. Es ist keine arithmetische Operation. Liefert dein 1. Query Artikel A, B und C und dein 2. Query liefert Artikel B, kommt MINUS-verknuepft nur Artikel A und C zurück.

Einen einfach MINUS-Query kann man auch mit NOT EXISTS abbilden:

SELECT artikel FROM table a WHERE attribut=1 AND NOT EXISTS (SELECT 1 FROM table b WHERE a.PrimaryKey=b.PrimaryKey AND attribut=2);

äquivalent zu

SELECT artikel FROM table WHERE attribut=1
MINUS
SELECT artikel FROM table WHERE attribut=2

ggf. auch via Self-Join

SELECT a.artikel FROM table a, table b WHERE a.PrimaryKey = b.PrimaryKey AND a.attribut=1 AND b.attribut!=2;
 
danke für die Antworten.

Hatte dann eine Lösung gefunden. (@Evil-Devil dein Vorschlag werde ich auch mal probieren)
Meine Lösung anhand meines obigen Beispiels:

SQL:
SELECT artikel,
 sum(if(attr1 = 1 AND attr = 'test1',1,0)) - sum(if(attr1 = 2 AND attr = 'test2',1,0)) as diff
FROM tabelle
WHERE attr3<>'0' GROUP BY artikel;
 
Schaut irgendwie seltsam aus deine Lösung. Wenn ich jetzt nicht eine total Vorstellung habe müsste das auch mit Self-Joins funktionieren. Kannst du sonst mal ein Beispiel posten wie die Daten in der Tabelle organisiert sind?
 

Zurück
Oben