Samuel Vogel: Frage zu kompliziertem SQL Statement

Hey Leute,

Ich habe folgendes SQL Statement:

SELECT defendantFROMabuse WHERE ( t1.action!= 'skip' GROUP BYdefendantHAVING COUNT(*) >= 3 ) OR EXISTS (SELECT NULL FROMabuse 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

  1. 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

    1. 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.

      1. 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

        1. 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 ;)