2016-08-08 4 views
-1

Ich habe eine Datenbank mit zwei Tabellen:MySQL Query, um eine Liste von Ereignissen mit mindestens 3 verschiedenen Status zu erhalten?

Events(id, name, is_active)

Event_logs(id, event_id, status, message)

ich alle Ereignisse zur Liste möchten, die in mindestens drei verschiedenen status logs hatte und ist immer noch aktiv (is_active=1) und ich kann nicht die richtige MySQL Abfrage dazu finden, das zu tun.

(Ich kann mehr Details hinzufügen, wenn nötig, fragen Sie einfach :)).

Hier ist der SQLFiddle: http://sqlfiddle.com/#!9/a7442

In diesem Beispiel, ich suche die Ereignis-ID 2 zu erhalten, weil es enthält 3 verschiedenen Status in event_log: INFO, WARNING und ERROR. Event ID 1 und 3 enthält weniger als 3 und so sind ausgeschlossen.

Vielen Dank für Ihre Hilfe!

+0

ich frage. Befolgen Sie diese einfache zweistufige Vorgehensweise: 1. Wenn Sie dies noch nicht getan haben, geben Sie die richtigen CREATE- und INSERT-Anweisungen (und/oder ein sqlfiddle) an, damit wir das Problem leichter replizieren können. 2. Wenn Sie dies noch nicht getan haben, geben Sie eine gewünschte Ergebnismenge ein, die den in Schritt 1 bereitgestellten Informationen entspricht. 14.3k? Wie ist das passiert? – Strawberry

+0

Ich bin mir ziemlich sicher, dass ich das überdenke und so stehe ich auf diese Weise fest. Ich bin mir ziemlich sicher, dass es einfach ist, aber ich stecke fest. –

+0

Ich habe die Beschreibung aktualisiert, um die Geige einzubeziehen, vielleicht hilft es mein Problem besser zu verstehen. –

Antwort

2

Vielleicht mehr Kaffee benötigt wird ...

SELECT e.* 
    FROM events e 
    JOIN event_logs l 
    ON l.event_id = e.id 
WHERE is_active=1 
GROUP 
    BY e.id 
HAVING COUNT(DISTINCT l.status) >=3 
+0

... oder vielleicht wusste ich nicht über COUNT (DISTINCT ..). Danke für Ihre Hilfe. –

+0

perfekt. Ich war nicht in der Lage, die Geige zu öffnen, also danke für das Eintreten :) – Utsav

+0

... daher mein vorheriger Kommentar! – Strawberry

1

nicht getestet, aber wenn ich die Anforderung richtig zu verstehen, sollte diese

arbeiten
select e.id , l.status 
from events e 
inner join event_logs l 
on e.id=l.event_id 
where l.is_active=1 
group by e.id,l.status 
having count(*) >=3 
+0

Vielen Dank für Ihre Anfrage. Das Ergebnis gibt eine Liste der Ereignis-ID zurück, in der event_logs mehr als 3 Mal vorkommen, aber es enthält einige Ereignisse, die 5-mal den gleichen Status haben. Ich schaue, um die Ereignisse aufzulisten, wo die Protokolle 3 differents Status enthalten. Es tut mir leid, wenn es nicht klar ist: Ich werde das 'INSERT' und das erwartete Ergebnis hinzufügen. –

+0

@ CyrilN. Sei also etwas genauer, was du zählst. Dies ist nicht schwierig, und eine oberflächliche Untersuchung von COUNT innerhalb des Handbuchs würde die Antwort offenbaren. – Strawberry

+0

'aber es enthält einige Ereignisse, die 5 mal den gleichen Status haben. Um es zu vermeiden, habe ich' l.status' bereits in 'group by' gesetzt. Die Bereitstellung von Beispieldaten und der erwarteten Ausgabe würde helfen, sie besser zu verstehen. – Utsav