2017-10-27 1 views
2

Dieses Problem stört mich jetzt seit ein paar Stunden. Nachdem ich herausgefunden hatte, dass meine alte Abfrage ein Problem hatte, musste ich es neu erstellen.Mehrere Zeilen mit demselben Bezeichner, wie wählt man die Zeile mit dem höchsten Wert (ignoriert den Rest) mit mehreren linken Joins?

Die Situation:

Ich brauche jeden patient_id mit einem clinic_id entsprechen, und dafür möchte ich bekommen alle Termine der patient_id verwenden, die höchste appointment_id finden und verwenden seine clinic_id die letzte bekannte clinic_id einstellen .

Meine alte Abfrage tat dies, aber es übersprang Patienten, die nie einen Termin hatten.

Dies sind meine aktuellen Ergebnisse, aber ich muss meine Ergebnisse filtern. Die Frage ist, wie?

+---------------+-------------------+-------------------+---------------+ 
| patient_id | country_code | appointment_id | clinic_id | 
+---------------+-------------------+-------------------+---------------+ 
|  111  |  UK   |  620   |  3  | 
|  111  |  UK   |  621   |  2  | 
|  111  |  UK   |  1995  |  1  | 
|  222  |  UK   |  609   |  3  | 
|  222  |  UK   |  610   |  2  | 
|  333  |  UK   |  null  |  null | 
|  444  |  UK   |  null  |  null | 
+---------------+-------------------+-------------------+---------------+ 

Was ich will, ist die folgende:

+---------------+-------------------+-------------------+---------------+ 
| patient_id | country_code | appointment_id | clinic_id | 
+---------------+-------------------+-------------------+---------------+ 
|  111  |  UK   |  1995  |  1  | 
|  222  |  UK   |  610   |  2  |  
|  333  |  UK   |  null  |  null | 
|  444  |  UK   |  null  |  null | 
+---------------+-------------------+-------------------+---------------+ 

ich jetzt die folgende Abfrage verwenden:

SELECT 
    patient.id, 
    systemcountry.country_code, 
    appointment_patient.appointment_id, 
    appointment.clinic_id 
FROM 
    patient 
     LEFT JOIN 
    systemcountry ON patient.country_id = systemcountry.id 
     LEFT JOIN 
    appointment_patient ON patient_id = patient.id 
     LEFT JOIN 
    appointment ON appointment_patient.appointment_id = appointment.id 

Das war meine alte Abfrage, das ein Problem hatte so dass es zu überspringen Sie Patienten, die nie einen Termin hatten:

SELECT 
    patient.id AS patient_id, 
    systemcountry.code AS systemcountry_code, 
    appointment.clinic_id 
FROM 
    patient 
     LEFT JOIN 
    systemcountry ON patient.land_id = systemcountry.id, 
    appointment 
WHERE 
    appointment.id = (SELECT 
      MAX(appointment_id) 
     FROM 
      appointment_patient 
     WHERE 
      patient_id = patient.id); 

Ich bin noch ein Anfänger, also gehen Sie einfach auf mich.

Ich schätze jeden Eingang, danke!

+0

Hallo. Bitte zeigen Sie Ihre DDL & EXPLAIN-Ausgabe - und den Rest eines [mcve]. Untersuchen Sie auch das Tag "Größte-n-pro-Gruppe". – philipxy

+0

Ich nahm die Verknüpfung und zwei separate Abfragen, um die Ergebnisse zu erhalten, die ich wollte. Die Abfragen wurden in einer Datenbankkonvertierungsanwendung verwendet. Danke für alle Inputs! –

+0

Hallo. Bitte denken Sie darüber nach, eine Antwort auf Ihre Frage zu verfassen und (später) zu akzeptieren. PS Wenn es bei einer so einfachen Abfrage lange dauert, lesen Sie über Indizes. Wenn Sie MCVE gepostet hätten, dann hätten die Beantworter dies gegebenenfalls ansprechen können. – philipxy

Antwort

0

können Sie versuchen, Funktion max() über Spalten, deren einzige höchste Wert, den Sie, dann die Gruppe durch die Ergebnismenge patient.id

SELECT 
    patient.id, 
    systemcountry.country_code, 
    max(appointment_patient.appointment_id), 
    appointment.clinic_id 
FROM 
    patient 
     LEFT JOIN 
      systemcountry ON patient.country_id = systemcountry.id 
     LEFT JOIN 
      appointment_patient ON patient_id = patient.id 
     LEFT JOIN 
      appointment ON appointment_patient.appointment_id = appointment.id 
GROUP BY patient.id 
+0

Ich habe dies versucht, bevor ich nach Hause ging, aber die Abfrage gestoppt, weil es mehr als 10 Minuten lief, um Ergebnisse zu erhalten. Es gibt ungefähr eine Million Termine in unserer Datenbank mit ungefähr 30.000 Patienten. –

+0

Ich habe es heute noch einmal versucht und es lief für ein paar Minuten, bevor meine Verbindung abgelaufen ist. –

1

Bewegen Sie den Unterauswahl in Ihrer ursprünglichen Abfrage WHERE-Klausel in einen linken wollen JOIN (etwas in der Art):

LEFT JOIN 
    (SELECT MAX(appointment_id), patient_id 
     FROM appointment_patient 
     GROUP BY patient_id) as apt ON patient.patient_id=apt.patient_id 
+0

Zur Verdeutlichung, in ziemlich großen Datenbanken würde ich empfehlen zu verstehen, wie dies funktioniert und wie Abfragen wie diese zu optimieren. – LegendaryJLD

+0

Ich werde Ihre Lösung versuchen, wenn ich am Montag wieder im Büro bin. –

+0

Tut mir leid, ich konnte es nicht funktionieren. –

Verwandte Themen