2017-07-29 14 views
4

Ich habe Schwierigkeiten, eine etwas komplexere SQL-Abfrage einzurichten. Was ich versuche zu tun, ist die letzten 24 Einträge für jede zr_miner_id, aber ich bekomme immer SQL-Timeouts (die Tabelle hat etwa 40000 Einträge bisher). Also sagen wir, es gibt 200 Einträge für zr_miner_id 1 und 200 für zr_miner_id 2, würde ich mit 48 Ergebnissen enden.SQL-Abfrage zum Auswählen der letzten X-Einträge für ein bestimmtes nicht primäres Feld

Bisher bin ich mit der Abfrage unten gekommen. Was dies tun soll, ist jedes Ergebnis in zec_results auszuwählen, das weniger als 24 neuere Einträge mit demselben zr_miner_id hat. Ich konnte mir keinen besseren Weg vorstellen, um diese Aufgabe zu erledigen, aber andererseits bin ich noch nicht so weit fortgeschritten bei SQL.

SELECT results_a.* 
FROM zec_results results_a 
WHERE (
    SELECT COUNT(results_b.zr_id) 
    FROM zec_results AS results_b 
    WHERE results_b.zr_miner_id = results_a.zr_miner_id 
    AND results_b.zr_id >= results_a.zr_id 
) <= 24 

Antwort

0

Variablen verwenden!

SELECT r.* 
FROM (SELECT r.*, 
      (@rn := if(@m = r.zr_miner_id, @rn + 1, 
         if(@m := r.zr_miner_id, 1, 1) 
         ) 
      ) as rn 
     FROM zec_results r CROSS JOIN 
      (SELECT @m := -1, @rn := 0) params 
     ORDER BY r.zr_miner_id, r.zr_id DESC 
    ) r 
WHERE rn <= 24 ; 

Wenn Sie die Abfrage in eine Ansicht einfügen möchten, funktioniert das obige nicht. Die Leistung Ihres Ansatzes könnte sich mit einem Index auf (zr_miner_id, zr_id) verbessern.

+0

Danke für Ihre Antwort. Das ist völlig außerhalb meiner Fähigkeiten. Ich bekomme den folgenden Fehler: # 1054 - Unbekannte Spalte 'z.zr_miner_id' in Feldliste in der Nähe von "FROM" an Position 194. –

+0

Es gibt auch an: 1. Dieser Typ der Klausel wurde zuvor analysiert. (nahe "FROM" an Position 194) 2. Nicht erkannter Anweisungstyp. (in der Nähe von "FROM" an Position 194) –

Verwandte Themen