Frage an SQL-Profis DISTINCTROW bei Group By?

BMo

Mitglied
Ich habe folgende MYSQL abfrage:

SELECT DISTINCTROW kategorie.T_ID, kategorie.T_Bez, gruppe.G_ID, gruppe.G_Bez, Count( * ) AS Anzahl
FROM artikel
INNER JOIN (
kategorie
INNER JOIN (
gruppe
INNER JOIN waffen ON gruppe.G_ID = waffen.Gruppe
) ON kategorie.T_ID = waffen.Kategorie
) ON artikel.A_ID = waffen.Artikel
GROUP BY kategorie.T_ID, kategorie.T_Bez, gruppe.G_ID, gruppe.G_Bez, artikel.A_Verkauft
HAVING (
(
(
kategorie.T_ID
) =14
)
)
AND (
(
(
artikel.A_Verkauft
) =0
OR (
artikel.A_Verkauft
) IS NULL
)
)
LIMIT 0 , 30

Ausgabe:

T_ID T_Bez G_ID G_Bez Anzahl
14 Jagd 16 Blankwaffen 13
14 Jagd 16 Blankwaffen 1
14 Jagd 17 Gewehre 51
14 Jagd 18 Pulverflaschen 16
14 Jagd 19 Teile/Zubehör 5

Das Problem ist, dass eigentlich
14 Jagd 16 Blankwaffen 14 rauskommen sollte und nicht 13 und 1
Es liegt daran, dass in den 13 Einträgen
artikel.A_Verkauft = Null ist und in dem einen gleich 0
Kann ich das irgendwie zusammenfassen?
In Access funktioniert die Abfrage wunderbar, in MYSQL aber leider nicht.
Bitte um Hilfe!
 
Ich weiß schon warum ich Access nicht mag!

Code:
SELECT DISTINCTROW kategorie.T_ID, kategorie.T_Bez, gruppe.G_ID, gruppe.G_Bez, Count( * ) AS Anzahl
FROM artikel
INNER JOIN kategorie
ON kategorie.T_ID = waffen.Kategorie
INNER JOIN gruppe
ON gruppe.G_ID = waffen.Gruppe
INNER JOIN waffen
ON artikel.A_ID = waffen.Artikel
GROUP BY kategorie.T_ID, kategorie.T_Bez, gruppe.G_ID, gruppe.G_Bez, artikel.A_Verkauft
HAVING kategorie.T_ID = 14 
AND (artikel.A_Verkauft=0 OR artikel.A_Verkauft IS NULL)
LIMIT 0,30

So dürfte das ganze in MySQL funktionieren wenn ich mich nicht verschrieben habe!

Edit: Er gibt die 13 und die 1 aus, da du ja nach artikel.A_Verkauft gruppierst, dadurch sind das dann zwei verschiedene Gruppen, wenn du diese gruppierung rausnimmst, dann dürfte es gehen
 
Zuletzt bearbeitet:
Bekomme den Fehler #1054 - Unknown column 'waffen.Kategorie' in 'on clause'

aber soweit ich sehe ist alles richtig geschrieben.

Warum ziehst du denn die Join auseinander?
 
Ohhh mhhhh dann musst du die JOINs ein wenig umstellst, sodass der INNER JOIN waffen ON artikel.A_ID = waffen.Artikel zuerst steht, dann dürfte es gehen!

Ich finde meinen Code "leicht" übersichtlicher alles diesen dirty Code von Access
 
Ich habe jetzt:

SELECT DISTINCTROW kategorie.T_ID, kategorie.T_Bez, gruppe.G_ID, gruppe.G_Bez, Count( * ) AS Anzahl
FROM artikel
INNER JOIN waffen ON artikel.A_ID = waffen.Artikel
INNER JOIN kategorie ON kategorie.T_ID = waffen.Kategorie
INNER JOIN gruppe ON gruppe.G_ID = waffen.Gruppe
GROUP BY kategorie.T_ID, kategorie.T_Bez, gruppe.G_ID, gruppe.G_Bez, artikel.A_Verkauft
HAVING (
(
(
kategorie.T_ID
) =14
)
)
AND (
(
(
artikel.A_Verkauft
) =0
OR (
artikel.A_Verkauft
) IS NULL
)
)
LIMIT 0 , 30

kein Fehler, aber immer noch das gleiche Ergebnis :-(
Danke!
 
übersichtlicher ist er jetzt, aber das löst leider mein Problem noch nicht

SELECT DISTINCTROW kategorie.T_ID, kategorie.T_Bez, gruppe.G_ID, gruppe.G_Bez, Count( * ) AS Anzahl
FROM artikel
INNER JOIN waffen ON artikel.A_ID = waffen.Artikel
INNER JOIN kategorie ON kategorie.T_ID = waffen.Kategorie
INNER JOIN gruppe ON gruppe.G_ID = waffen.Gruppe
GROUP BY kategorie.T_ID, kategorie.T_Bez, gruppe.G_ID, gruppe.G_Bez, artikel.A_Verkauft
HAVING kategorie.T_ID =14 AND (artikel.A_Verkauft =0 OR artikel.A_Verkauft IS NULL) LIMIT 0 , 30
 
Das Problem dürfte bei deinem GROUP BY liegen, was passiert denn wenn du dort das artikel.A_Verkauft rausnimmst?

Edit:
Dann dürftest du auch die Abfrage in der HAVING Klausel nicht mehr brauchen
 
Hab ich schon versucht, aber dann geht eben die Having abfrage nicht mehr...

hm, aber ich könnte das ja in ein Where ziehen oder?
 
Dann solltest du das nicht über das Having machen, du kannst ja schon vorher, per WHERE nur die Datensätze übergeben, die bei artikel.A_Verkauft eine 0 oder NULL haben.

SELECT DISTINCTROW kategorie.T_ID, kategorie.T_Bez, gruppe.G_ID, gruppe.G_Bez, Count( * ) AS Anzahl
FROM artikel
INNER JOIN waffen ON artikel.A_ID = waffen.Artikel
INNER JOIN kategorie ON kategorie.T_ID = waffen.Kategorie
INNER JOIN gruppe ON gruppe.G_ID = waffen.Gruppe
WHERE kategorie.T_ID = 14 AND (artikel.A_Verkauft = 0 OR artikel.A_Verkauft IS NULL)
GROUP BY kategorie.T_ID, kategorie.T_Bez, gruppe.G_ID, gruppe.G_Bez
LIMIT 0 , 30

Müsste eigentlich auch funktionieren
 
Zurück