Mysql Group By Having

mr.burns!

Neuer Benutzer
Beiträge
3
Hallo,
Ich habe 3 Tabellen (szenarien, sprache, schulstufe), die miteinander über die szenarien.id bzw. über sprache.szenarien_id und schulstufe.szenarien_id in Beziehung stehen.
Über LEFT JOIN und WHERE .. IN ..hol ich mir alle gewünschten Möglichkeiten (siehe Bild)

SELECT szenarien.id,schulstufe.schulstufe,sprache.sprache FROM szenarien LEFT JOIN schulstufe ON schulstufe.szenarien_id = szenarien.id LEFT JOIN sprache ON sprache.szenarien_id = szenarien.id WHERE (schulstufe.schulstufe) IN (3,4) AND (sprache.sprache) IN ('DE','EN')


result.jpg


Jetzt kommt der Teil, bei dem ich nicht weiter weiß:
Ich möchte nur die id bekommen, bei denen alles zutrifft (sprache: DE und EN und schulstufe 3 und 4) => also id:1.
Das ganze sollte auch möglich sein, wenn ich z.B. bei einer Tabelle (z.B. sprache) gar nichts oder mehr Einträge mache.
Hab mich bisher mit GROUP BY und HAVING beschäftigt - komme aber nicht zu einem brauchbaren Ergebnis. Veilleicht ist aber auch mein Ansatz bis dahin schon verkehrt.
Wenn mir jemand bei diesem Problem helfen könnte, wäre ich sehr dankbar.
 
Werbung:
Code:
test=*# select * from foo;
 id | schulstufe | sprache
----+------------+---------
  1 |          3 | DE
  1 |          3 | en
  2 |          3 | de
  2 |          4 | de
  1 |          4 | de
  1 |          4 | en
(6 rows)

test=*#

Da ich einmal DE und einmal de habe, muß ich nun mit lower(sprache) arbeiten, aber das Prinzip ist:

Code:
test=*# select id, count(distinct schulstufe), count(distinct lower(sprache)) from foo group by id having count(distinct schulstufe) = 2 and count(distinct lower(sprache)) = 2;
 id | count | count
----+-------+-------
  1 |     2 |     2
(1 row)
 
Danke für die schnelle Antwort.
Ich bin jetzt nicht sicher, soweit ich das verstanden habe, wird das Zwischenergebnis in foo temporär gespeichert und dann von foo eine weitere Abfrage gemacht. Verstehe ich das richtig und wenn ja, wie wird dieser Zwischenweg realisiert (habe bisher nur einen direkten Weg gehabt). Oder verstehe ich da was falsch.
Vielen Dank
 
Du kannst Deine bisherige Abfrage einfach da einsetzen, also für

... from foo ...

schreibst Du:

... from (hier deine bisherige Abfrage) foo ...


Oder Du verwendest CTE (Common Table Expressions), also:

with foo as (hier Deine jetzige Abfrage) select ... <hier die Abfrage von mir>


CTE können fast alle Datenbanken, natürlich macht MySQL da wieder eine Ausnahme.
 
Werbung:
Super, es funktioniert:

select szenarien.id, count(distinct schulstufe), count(distinct lower(sprache)) from szenarien LEFT JOIN schulstufe ON schulstufe.szenarien_id = szenarien.id LEFT JOIN sprache ON sprache.szenarien_id = szenarien.id WHERE (schulstufe.schulstufe) IN (3,4) AND (sprache.sprache) IN ('DE','EN') group by szenarien.id having count(distinct schulstufe) = 2 and count(distinct lower(sprache)) = 2

Vielen Dank für deine Hilfe
 
Zurück
Oben