MySQL wildcards / HAVING
Michael S.
- datenbank
Ich hab beim rumprobieren festgestellt, dass während
SELECT * FROM xy WHERE a LIKE "%teilstring%"
alle strings anzeigt in denen teilstring vorkommt, unabhängig von l/u-case
Wenn ich aber Spalteninhalte aufsummieren will mit
SELECT SUM(Spalte),* GROUP BY xy HAVING a LIKE "%teilstring%"
die Summe nur nach genauen matches summiert, sprich keine wildcards akzeptiert. Kann ich da was dran machen?
mfg
Micha
echo $begrüßung;
Wenn ich aber Spalteninhalte aufsummieren will mit
SELECT SUM(Spalte),* GROUP BY xy HAVING a LIKE "%teilstring%"
die Summe nur nach genauen matches summiert, sprich keine wildcards akzeptiert. Kann ich da was dran machen?
HAVING wird für deinen Fall viel zu spät ausgeführt. HAVING ist auch kein gleichwertiger Ersatz für WHERE sondern hat die Aufgabe, aus der bereits fertigen Ergebnismenge noch ein paar Einträge wegzufiltern. Wenn bestimmte Werte nicht in die Berechnung eingehen sollen, musst du sie mit WHERE filtern.
echo "$verabschiedung $name";
joa, das HAVING bezieht sich auf GROUP BY und beschränkt das gruppieren auf spalten.
das beantwortet aber nicht ganz meine frage, wie ich jetzt anstelle, dass das, was ich als suchergebnisse hatte gezählt wird.
echo $verabschiedung
echo $begrüßung;
joa, das HAVING bezieht sich auf GROUP BY und beschränkt das gruppieren auf spalten.
Nein, das HAVING bezieht sich auf die bereits ermittelten Ergebnisse sämtlicher vorangegangener Klauseln. Sind Aggregatfunktionen auszuführen, so werden diese beim Bearbeiten der GROUP-BY-Klausel angewendet, bevor das Ergebnis an HAVING weitergereicht wird.
Zitat aus dem Handbuch:
The HAVING clause is applied nearly last, just before items are sent to the client ...
Die Reihenfolge, in der die Klauseln FROM, WHERE, GROUP BY, HAVING, ORDER BY und LIMIT notiert werden müssen, entspricht im Wesentlichen der Reihenfolge ihrer Anwendung auf die in der Datenbank befindlichen Daten. Jede Klausel arbeitet dabei (von Optimierungen abgesehen) eigenständig, bevor die Verarbeitung an die nächste weitergegeben wird.
das beantwortet aber nicht ganz meine frage, wie ich jetzt anstelle, dass das, was ich als suchergebnisse hatte gezählt wird.
Wenn bestimmte Werte nicht in die Berechnung eingehen sollen, musst du sie mit WHERE filtern.
echo "$verabschiedung $name";
yo,
Nein, das HAVING bezieht sich auf die bereits ermittelten Ergebnisse sämtlicher vorangegangener Klauseln. Sind Aggregatfunktionen auszuführen, so werden diese beim Bearbeiten der GROUP-BY-Klausel angewendet, bevor das Ergebnis an HAVING weitergereicht wird.
syntaktisch sicherlich nicht, inhaltlich beziehen sie sich doch immer auf die gruppierungen, weil es sonst besser in der WHERE klausel aufgehoben wäre. HAVING hat also inhaltlich immer einen bezug auf die gruppierungen. das macht auch in der ausführung sinn, datensätze nicht erst in die gruppierung mit reinzunehmen, die man unabhängig von der gruppe ausschließen könnten.
Ilja
echo $begrüßung;
Nein, das HAVING bezieht sich auf die bereits ermittelten Ergebnisse sämtlicher vorangegangener Klauseln. Sind Aggregatfunktionen auszuführen, so werden diese beim Bearbeiten der GROUP-BY-Klausel angewendet, bevor das Ergebnis an HAVING weitergereicht wird.
syntaktisch sicherlich nicht, inhaltlich beziehen sie sich doch immer auf die gruppierungen, weil es sonst besser in der WHERE klausel aufgehoben wäre. HAVING hat also inhaltlich immer einen bezug auf die gruppierungen. das macht auch in der ausführung sinn, datensätze nicht erst in die gruppierung mit reinzunehmen, die man unabhängig von der gruppe ausschließen könnten.
Ist es schlimm, wenn ich in deiner allgemein gehaltenen Antwort auf meine ebenfalls zu allgemein gehaltene Aussage - an der (deiner Antwort) ich, wenn es um andere DBMSe ginge nicht zu zweifeln wagen würde - und der im Handbuch beschriebenen Arbeitsweise von HAVING unter MySQL leichte Differenzen sehe? (SELECT Syntax - Abschnitte "The HAVING clause is applied..." und folgende) Vermutlich ist das wieder nur eine der MySQL-Eigenmächtigkeiten. Konkret auf das Problem des OP bezogen, sehe ich hier eine erwähnte "Erweiterung" gegenüber dem Standard. Ich interpretiere das Handbuch so, dass durch die nicht in der Gruppierung angegebene Spalte a sich das HAVING nicht direkt auf die Gruppierung bezieht sondern eigenständig betrachtet wird.
echo "$verabschiedung $name";
yo $begrüßung,
Ist es schlimm, wenn ich in deiner allgemein gehaltenen Antwort auf meine ebenfalls zu allgemein gehaltene Aussage - an der (deiner Antwort) ich, wenn es um andere DBMSe ginge nicht zu zweifeln wagen würde - und der im Handbuch beschriebenen Arbeitsweise von HAVING unter MySQL leichte Differenzen sehe?
also schlimm ist es auf gar keinen fall. mysql und gruppierungen ist schon so eine sache, die nicht wirklich immer glücklich ist. aber selbst unter mysql beziehen sich die having anweisungen inhaltlich (nicht syntaktisch) auf die gruppierungen. zum einen ist das mit dem HAVING ja nur die fortsetzung aus der möglichkeit sich unter mysql gruppierungen zu sparen oder vielmehr, nur die anweisung und somit die sortierung zu sparen.
aber letztlich hat man auch unter mysql wie auch bei jedem anderen dbms bei der gleichen datenquelle die gleichen datensätze in den jeweiligen gruppierungen zu stehen, nur das man eben nicht alle gruppierungen expliziet mit angeben muss. und das zieht sich dann auf das HAVING fort. inhaltlich, und das war meine aussage, ist es aber genau das gleiche, HAVING macht nur sinn in bezug auf die gruppierungen.
selektionen, die nichts mit der gruppierung zu tun haben sollen auch unter mysql in die WHERE und nicht in die HAVING klausel, wie man ein wenig weiter unten lesen kann.
Ich interpretiere das Handbuch so, dass durch die nicht in der Gruppierung angegebene Spalte a sich das HAVING nicht direkt auf die Gruppierung bezieht sondern eigenständig betrachtet wird.
ich interpretiere das handbuch so, dass man bestimmte gruppierungen nicht expoliziet angeben muss, obwohl die gruppierungen vom inhalt vorhanden sein müssen.
Ilja
Hi Micha,
vielleicht wird es etwas deutlicher, wenn Du mal ein paar Beispiel-Datensätze der Tabelle postest.
Gruß
Hans
Hi,
ich habe weniger was zu deinem konkreten Problem als mehr zu deiner generellen Abfrage anzumerken.
SELECT SUM(Spalte),* GROUP BY xy HAVING a LIKE "%teilstring%"
Das ist eine - streng nach SQL-Standard - verbotene GROUP-BY-Abfrage, die dir MySQL zwar durchgehen lässt, bei der du aber früher oder später auch bei neueren MySQL-Versionen auf Probleme stoßen könntest.
Die Grundregel für SELECT+GROUP BY lautet eigentlich: Es dürfen nur solche Spalten abgefragt werden nach denen gruppiert wurde bzw. die durch eine Aggregat-Funktion (z.B. SUM, MAX, COUNT) entstanden sind.
In deinem Fall sind demnach nur SUM(spalte) und xy zulässig, eine Spalte a dürfte eigentlich nach der Gruppierung gar nicht mehr existieren. Es kann auch gut sein, dass genau da die Toleranz von MySQL aufhört und du deswegen nicht das gewünschte Ergebnis bekommst.
MfG
Rouven
yo,
Die Grundregel für SELECT+GROUP BY lautet eigentlich: Es dürfen nur solche Spalten abgefragt werden nach denen gruppiert wurde
du meinst mit abgefragt sicherlich den begriff ausgegeben (angezeigt) werden. abgefragt in bezug auf die where klausel dürfen nämlich solche spalten sehr wohl, über die nicht gruppiert wurde.
Ilja
Hi,
du meinst mit abgefragt sicherlich den begriff ausgegeben (angezeigt) werden. abgefragt in bezug auf die where klausel dürfen nämlich solche spalten sehr wohl, über die nicht gruppiert wurde.
stimmt, über die Formulierung hab ich nicht so nachgedacht, also ich meinte SELECTen vs. WHEREn :-)
MfG
Rouven