2017-06-12 2 views
1

Ich habe eine sql view dieletzte Datensatz aus MySql Ansicht wählen

leadId status statusTime 
-------------------------- 
1361 new  2017-06-12 11:57:33 
1358 new  2017-06-12 11:20:46 
1358 warm 2017-06-12 11:21:20 
1358 closed 2017-06-12 11:56:57 

wie unten Daten sehen Sie sehen, dass die leadId 13583 lead status hat und die letzte ist latest. Also ich möchte den satz wie unter tabelle

leadId status statusTime 
-------------------------- 
1361 new  2017-06-12 11:57:33 
1358 closed 2017-06-12 11:56:57 

wie kann ich das erreichen ?? Danke

+0

starten: Wählen Sie max (lead_id), Status statusTime aus Tabelle Gruppe von lead_id, Status statusTime –

+0

max (lead_id) kann @MuhammadMuazzam nicht korrigieren, er muss die Basis auf statusTime abrufen –

+0

ja, Ihre Abfrage zieht den ältesten Datensatz. aber ich brauche neuesten Datensatz basierend auf statusTime –

Antwort

0

Eine kanonische Art, dies in MySQL zu behandeln, ist, Ihre Ansicht zu einer Unterabfrage zu verbinden, die die letzten Statuszeiten für jede leadId identifiziert. Diese Verknüpfung filtert alle Datensätze mit Ausnahme der letzten Datensätze.

SELECT v1.* 
FROM yourView v1 
INNER JOIN 
(
    SELECT leadId, MAX(statusTime) AS max_status_time 
    FROM yourView 
    GROUP BY leadId 
) v2 
    ON v1.leadId  = v2.leadId AND 
     v1.statusTime = v2.max_status_time 

Eine Alternative dazu wäre eine korrelierte Unterabfrage zu verwenden, aber das würde wahrscheinlich nicht so gut wie durchführen, was oben angegeben wurde.

Demo

+0

dies macht die Abfrage sehr langsam. Ich muss 4-5 Minuten warten, um die Ergebnisse zu erhalten –

+0

Meine Vermutung ist, dass die Langsamkeit auf die Ansicht zurückzuführen ist, und nicht auf meine Abfragestrategie, die wahrscheinlich hier verwendet werden sollte. Sie können versuchen, die Abfrage direkt in der Tabelle und nicht in der Ansicht auszuführen. Wie viele Datensätze hat Ihre Ansicht/Tabelle? –

+0

Es gibt viele Daten in der Tabelle (ca. 3000 Daten), und ich kann die Abfrage für die Tabelle nicht ausführen, ich muss auf Sicht ausgeführt werden, da viele Daten dort aus anderen 2 Tabellen gesammelt werden. –

0
select leadId,status,statusTime 
from your_view 
where (leadId,statusTime) 
    IN (select leadId,MAX(statusTime) as maxStatusTime 
     from your_view 
     GROUP BY leadId) 

zuerst die Einträge mit den neuesten statusTime finden sie dann verwenden, um die Details zu erhalten

Verwandte Themen