# MySql-Entsprechung MINUS (UNION) ?



## parabool (10. Dez 2012)

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.


```
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.


----------



## schlingel (10. Dez 2012)

NOT IN


----------



## parabool (10. Dez 2012)

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


----------



## Evil-Devil (10. Dez 2012)

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


----------



## OlliL (10. Dez 2012)

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;


----------



## parabool (12. Dez 2012)

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:


```
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;
```


----------



## Evil-Devil (18. Dez 2012)

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?


----------

