2016-10-22 1 views
0

Ich muss Zeilen in einer Tabelle zählen, wo das Feld event_id = 17 und ihre anderen Datensatz in der Tabelle mit höheren g_event_id und ist der gleiche Wert für prim_cid. Meine Tabelle enthält Ereignisse für Telefonanrufe. Alle Ereignisse für denselben Anruf teilen sich das Feld "prim_cid". Wenn das Feld event_id = 17 ich weiß, dass der Anruf in der Warteschlange ist, aber sobald er einen neuen Eintrag in der Tabelle beantwortet (selbe prim_cid) aber andere event_id auftritt. Also muss ich die Zeilen mit event_id = 17 zählen und habe später keinen Datensatz mit demselben prim_cid.Anzahl der SQL-Zeilen wo ID = x und andere Max (ID) gruppiert in der gleichen Tabelle

Meine Tabelle:

Ereignisse:

g_event_id prim_cid event_id event_time 
---------- -------- -------- ---------- 
1   1   16   2016-10-21 16:00:00 
2   1   17   2016-10-21 16:00:01 
3   1   18   2016-10-21 16:00:02 
4   2   15   2016-10-21 16:01:01 
5   2   17   2016-10-21 16:01:02 
6   3   16   2016-10-21 16:02:01 
7   3   17   2016-10-21 16:02:02 
8   3   18   2016-10-21 16:02:38 

Daraus Ich mag das Ergebnis erhalten:

1 

(als nur prim_cid 2 keinen höheren Rekord auf dem Feld g_event_id hat) Auch ich möchte eine Auswahl treffen, wo ich den Datensatz wie bekommen:

g_event_id prim_cid event_id event_time 
---------- -------- -------- ---------- 
5   2   17   2016-10-21 16:01:02 

In anderen SQL natürlich wählen :)

+0

Warum 'natürlich'? – Strawberry

Antwort

1

Sie wollen prim_cids zählen, die „wissen“, einen event_id 17, haben aber keine andere g_event_id, die höher ist, als die des 17-Ereignisses. Dies führt direkt zu SQL:

SELECT COUNT(DISTINCT seventeens.`prim_cid`) 
FROM `events` AS seventeens 
    LEFT JOIN `events` AS laters ON (seventeens.`prim_cid` = laters.`prim_cid` AND laters.`g_event_id` > seventeens.`g_event_id`) 
WHERE seventeens.`event_id` = 17 
    AND ISNULL(laters.`prim_cid`) 

Um Ihre zweite Aussage zu erfüllen würden Sie die folgende SELECT-Klausel für die gleiche Anweisung verwenden:

SELECT DISTINCT seventeens.* 
FROM ... 
+0

Danke, aber ich bekomme diesen Fehler: Fehler beim Ausführen der Abfrage. Spalte 'prim_cid' in Feldliste ist nicht eindeutig – Kristian

+0

es geändert zu SELECT COUNT (DISTINCT seventeens.prim_cid) FROM 'events' AS seventeens LEFT JOIN' events' AS laters ON (seventeens.'prim_cid' = laters.'prim_cid 'AND latters.g_event_id'> seventeens.g_event_id') WHERE seventeens.event_id' = 17 UND ISNULL (laters.prim_cid') Funktioniert! Danke vielmals! – Kristian

+0

Danke für die Korrektur. Das Präfix ist schriftlich verloren gegangen. – Arrmaniac

1

hier gehen Sie :)

SELECT COUNT(ev1.prim_cid) 
FROM events ev1 
WHERE ev1.event_id = 17 
AND (SELECT prim_cid 
      FROM events 
      WHERE g_event_id > ev1.g_event_id 
      AND prim_cid = ev1.prim_cid) IS NULL; 
+0

Dies ist eigentlich ein besserer Ansatz als die angenommene Antwort, weil es nicht "count (distinct)" verwendet. Diese Version wäre jedoch besser mit 'not exist' geschrieben. –

+0

Vielen Dank @Gordon In Bezug auf die Leistung denke ich, dass nicht EXISTS und IS NULL ist genau das gleiche, aber in Bezug auf Lesbarkeit stimme ich zu, dass NOT EXISTS ist besser. – noodlesegg

+0

Sie sind nur zufällig in diesem Fall identisch, weil 'prim_cid' nicht (vermutlich)' NULL' sein kann. –

Verwandte Themen