Frage zu COUNT(): Samuel Vogel

Morgen,

Ich habe folgendes SQL Statement:
SELECT defendant FROM abuse GROUP BY defendant HAVING COUNT(*) >= 3 LIMIT 1

Damit lese ich einen Eintrag (den defendant) aus der Datenbank aus, wenn er insgesamt 3 mal dort drin ist.
So weit so gut. Es gibt aber nun ein weiteres Feld action. Und ich will den defendant nur dann, wenn er 3 mal vorkommt UND mindestens einmal davon das Feld action, den Wert 'bad' hat.
Leider habe ich keine Ahnung wie ich das realisieren soll. Ich dachte vieleicht "WHERE COUNT(WHERE action = 'bad') >= 1", aber dies funktioniert so nicht.

Hier mal zur veranschaulichung ein Teil meiner Tabelle:
http://img516.imageshack.us/img516/5925/bild1fg9.png

Kann mir jemand Tips geben?

so long,
Samy

  1. yo,

    So weit so gut. Es gibt aber nun ein weiteres Feld action. Und ich will den defendant nur dann, wenn er 3 mal vorkommt UND mindestens einmal davon das Feld action, den Wert 'bad' hat.

    was du suchst nennt sich korrelierte unterabfrage. leider hast du uns dein dbms und deiner version verschwiegen, ich vermute mal mysql, wo unterabfragen ab 4.1+ unterstützt werden.

    SELECT t1.defendant
    FROM abuse t1
    WHERE EXISTS (SELECT NULL
                  FROM abuse t2
                  WHERE t2.defend = t1.defend
                  AND t2.action = 'bad'
                 )
    GROUP BY t1.defendant
    HAVING COUNT(*) >= 3
    LIMIT 1

    Ilja

    1. Danke für die Hilfe!
      Beim ersten Post hatte ich doch glatt Namen und Thema verwechselt.

  2. Hallo "Frage zu Count()"

    Du benutzt anscheinend MySQL, welche Version? Unterstützt dies Subqueries (Unterabfragen, Subselects)?

    Lass uns doch mal festhalten, was du gern hättest

    Alle "Defendant"'s, welche (WHERE ...)
     - mindestens 3x ingesamt vorkommen und gleichzeitig
     - mindestens 1x 'action' = 'bad' haben

    Also selektierst du alle "Defendant"'s, welche die erste Bedingung erfüllen

      
    SELECT defendant  
      FROM abuse  
      GROUP BY defendent  
      HAVING COUNT(*) >= 3  
    
    

    und alle "Defendant"'s, welche die 2. Bedingung erfüllen

      
    SELECT defendant  
      FROM abuse  
      WHERE action = 'bad'  
      GROUP BY defendent, action  
      HAVING COUNT(*) >= 1  
    
    

    Und jetzt musst du beides eigentlich nur noch miteinander verbinden, ein INNER JOIN auf 'defendant' täte sich da anbieten.

    HTH, Ciao, Frank

    1. Wenn du mir das mit dem Inner Join etwas genauer erklären könntes, wäre ich dir sehr dankbar!

      so long,
      Samy

      1. Hi,

        Ilja, hat dir bereits mit der korrellierenden Unterabfrage etwas geeignetes gegeben, würde ich sagen.

        SELECT a.defendant
           FROM (/* packe hier das eine select rein*/) a
           INNER JOIN (/* packe hier das andere select rein*/) b
              ON a.defendant = b.defendant

        So solltest du ebenfalls die Schnittmenge aus deinen zwei gewünschten kriterien bekommen.

        Ciao, Frank

        1. Hi,

          OT:

          nun dachte ich doch, dass Ihr Euch darum streitet, von wem Samuel Vogel ist:

          "Samuel Vogel von Frank"
          "Samuel Vogel von Samuel Vogel"
          "Samuel Vogel von Frank"

          ;-)

          Viele Grüße

          Jörg