Frage zu kompliziertem SQL Statement
Samuel Vogel
- datenbank
Hey Leute,
Ich habe folgendes SQL Statement:
SELECT
defendantFROM
abuse WHERE ( t1.
action!= 'skip' GROUP BY
defendantHAVING COUNT(*) >= 3 ) OR EXISTS (SELECT NULL FROM
abuse t2 WHERE t2.
defendant = t1.
defendant AND t2.
action = 'report');
Dieses Statement soll mir aus folgender Tabelle alle "defendant"s liefern, die entweder 3 mal vorkommen (aber 'skip' im Feld 'action' wird nicht gezählt) oder die einmal mit dem Wert 'report' im Feld 'action'.
+-----------+---------------------+--------+
| defendant | time | action |
+-----------+---------------------+--------+
| boss512@1 | 2007-10-09 11:27:45 | bad |
+-----------+---------------------+--------+
| ... | ... | ... |
+-----------+---------------------+--------+
Es funktioniert jedoch nicht, da ja "GROUP BY" immer nach "WHERE" Fragen kommen muss. Aber ich will ja praktisch, das das "GROUP BY" gar nicht immer ausgeführt wird.
Brauche ich dazu wirklich 2 SQL Statements, oder kann ich es in einem bewerkstelligen?
so long,
Samy
Hallo,
ich habe gehört, "HAVING" könnte man hinter ein GROUP BY setzen, was dann "so ähnlich" wirkt, wie ein "WHERE" aber auf den gruppierten Daten.
Dieses Statement soll mir aus folgender Tabelle alle "defendant"s liefern, die entweder 3 mal vorkommen (aber 'skip' im Feld 'action' wird nicht gezählt) oder die einmal mit dem Wert 'report' im Feld 'action'.
Dieses Statement ist nicht ganz eindeutig. Entweder oder oder oder ...
Warum bitte SELECT NULL ? Vielleicht liegt es ja einfach schon daran (ohne mich jetzt tiefer mit deinem Problem auseinandersetzen zu müssen).
Ciao, Frank
Warum bitte SELECT NULL ? Vielleicht liegt es ja einfach schon daran (ohne mich jetzt tiefer mit deinem Problem auseinandersetzen zu müssen).
Das "SELECT NULL" ist schon richtig, da es vollkommen egal ist was dort steht ob nun "*", "NULL" oder "action
", denn es wird da es eine Unterabfrage mit "EXISTS" ist eh ignoriert.
Na, dann liegt es halt eben nicht _daran_. :(
Um dich dem Ziel zu nähern, empfehle ich: zerlege einfach deine jetzige Abfrage in einzelne Teilbereiche (Datensätze, die Bedingung 1 erfüllen, ~ für Bedingung 2 ... usw) und dann schau, was in diesen beiden Ergebnismengen gleich bzw. vergleichbar ist.
Und UNION Operatoren sind auch ganz praktisch im Zusammenspiel mit EXISTS um OR Verschachtelungen mit weiteren Unterabfragen zu vermeiden ... nur mal so als Wink mit nem Wattestäbchen.
BTW: zwischen 'richtig', 'gut' und 'funktioniert' liegen auch noch Welten.
Frank
Und UNION Operatoren sind auch ganz praktisch im Zusammenspiel mit EXISTS um OR Verschachtelungen mit weiteren Unterabfragen zu vermeiden ... nur mal so als Wink mit nem Wattestäbchen.
Danke, UNION war genau das was ich brauchte ;)