[MySQL 4.0] Austauschbarkeit von WHERE- und HAVING-Bedingungen
Yadgar
- datenbank
High!
Da gibt es noch ein anderes Problem in meiner Greenbook-Datenbank:
select marken.Markenname, orgeln.Modell from orgeln_klaviaturen inner join orgeln on orgeln.Nr = Orgel_Nr inner join marken on orgeln.Marke = marken.Nr inner join klaviaturen on klaviaturen.Klaviatur_Nr = orgeln_klaviaturen.Klaviatur_Nr where Position>0 and Anzahl_Tasten not in (37, 44, 49, 61) group by Modell order by Markenname, Modell;
zeigt alle Orgeln mit einem, zwei, drei oder vier Manualen an, bei denen mindestens ein Manual nicht die Standardgröße (also 37, 44, 49 oder 61 Tasten) hat. Klappt soweit ganz prima... nur würde ich die Abfrage gerne auf zweimanualige Orgeln einschränken.
Mir ist klar, dass dazu erstens der zweite Teil der WHERE-Bedingung (Anzahl_Tasten NOT IN (37, 44, 49, 61)) zunächst einmal wegfallen und zweitens nach GROUP BY Modell HAVING COUNT(*)=2 stehen muss. Danach müsste aber irgendwie die ursprünglich zweite WHERE-Bedingung wieder zum Tragen kommen - aber ich weiß nicht, wie ich sie in die HAVING-Klausel einfügen soll! Wenn ich z. B. HAVING COUNT(*) AND Anzahl_Tasten NOT IN (37, 44, 49, 61) schreibe, bekomme ich eine Fehlermeldung
"Unknown column 'Anzahl_Tasten' in 'having clause'" - wieso?
Bis bald im Khyberspace!
Yadgar
echo $begrüßung;
select marken.Markenname, orgeln.Modell from orgeln_klaviaturen inner join orgeln on orgeln.Nr = Orgel_Nr inner join marken on orgeln.Marke = marken.Nr inner join klaviaturen on klaviaturen.Klaviatur_Nr = orgeln_klaviaturen.Klaviatur_Nr where Position>0 and Anzahl_Tasten not in (37, 44, 49, 61) group by Modell order by Markenname, Modell;
> Wenn ich z. B. HAVING COUNT(\*) AND Anzahl\_Tasten NOT IN (37, 44, 49, 61) schreibe, bekomme ich eine Fehlermeldung
> "Unknown column 'Anzahl\_Tasten' in 'having clause'" - wieso?
WHERE schränkt die aus den Tabellen zu holenden Datensätze ein. Ein HAVING wirkt auf die bereits ermittelten Datensätze und kann sich dabei auch nur noch auf die zu dem Zeitpunkt vorhandenen Daten beziehen. Es kann nicht rückwirkend Bedingungen hinzufügen. Wenn die Einschränkung auf überhaupt zu betrachtenden Datensätze gelegt werden soll, schreib sie ins WHERE, oder falls sie essentieller Bestandteil einer Verknüpfungsbedingung ist ins JOIN. Wenn die Einschränkung erst nach der Gruppierung und der Berechung der Spalten gemäß der SELECT-Klausel erfolgen kann, gehört sie ins HAVING.
echo "$verabschiedung $name";
High!
Wenn die Einschränkung auf überhaupt zu betrachtenden Datensätze gelegt werden soll, schreib sie ins WHERE, oder falls sie essentieller Bestandteil einer Verknüpfungsbedingung ist ins JOIN.
Wie soll letzteres gehen? Innerhalb von JOIN kann kein COUNT() als Bedingung stehen!
Bis bald im Khyberspace!
Yadgar
echo $begrüßung;
Wenn die Einschränkung auf überhaupt zu betrachtenden Datensätze gelegt werden soll, schreib sie ins WHERE, oder falls sie essentieller Bestandteil einer Verknüpfungsbedingung ist ins JOIN.
Wie soll letzteres gehen? Innerhalb von JOIN kann kein COUNT() als Bedingung stehen!
Die Datensätze können erst dann gezählt, wenn sie vollständig ermittelt wurden. Somit kann COUNT() kein Kriterium für eine generelle Einschränkung sein, sondern muss in eine abschließende Einschränkung unter HAVING untergebracht werden. Überlege dir, für jede deiner Bedingungen, ob sie dazu dient, die überhaupt zu betrachtenden Datensätze zu ermitteln oder ob sie eine Einschränkung aufgrund eines aus der Datenmenge berechneten Wertes ist.
Ansonsten wäre es auch günstig, deine Frage so zu gestalten, dass man kein Fachwissen zu haben braucht. Für Antwortende ist es nur interessant, dass z.B. im Feld X der Wert Y drinstehen muss, nicht das ein bestimmtes Gerät irgendwelche Eigenschaften haben soll. Du kannst diese Geräte-Eigenschaften auf Werte in der Datenbank "umrechnen", weil du die Zusammenhänge kennst. Ich kann das beispielsweise nicht.
echo "$verabschiedung $name";