Samuel Vogel
Frage zu COUNT()
- datenbank
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
yo,
So weit so gut. Es gibt aber nun ein weiteres Feld
action
. Und ich will dendefendant
nur dann, wenn er 3 mal vorkommt UND mindestens einmal davon das Feldaction
, 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
Danke für die Hilfe!
Beim ersten Post hatte ich doch glatt Namen und Thema verwechselt.
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
Wenn du mir das mit dem Inner Join etwas genauer erklären könntes, wäre ich dir sehr dankbar!
so long,
Samy
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
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