2017-02-08 4 views
0

Ich möchte die Ärzte extrahieren, für die vorletzten Patienten in umgekehrter Reihenfolge ihrer Erstellung 2016die zweite letzten Zeile eines jeden in Mysql Vergleich

ÄRZTEN erstellt wurde

| id | name | 
| 1 | Ryan | 
| 2 | Pete | 
| 3 | Anna | 
| 4 | Harry | 

PATIENTEN

| id | name | surgeon_id | created_at | 
| 1 | Gloria |  1  | 2016-05-01 | 
| 2 | Bob |  1  | 2016-06-21 | 
| 3 | Alex |  2  | 2015-05-01 | 
| 4 | Jim |  2  | 2016-05-01 | 
| 3 | Kay |  3  | 2016-05-01 | 
| 5 | Kim |  4  | 2016-05-01 | 
| 6 | Joe |  4  | 2017-01-03 | 

das Ergebnis muss also sein Ryan (1) und Harry (4) wegen:

| 1 | Gloria |  1  | 2016-05-01 | 
| 5 | Kim |  4  | 2016-05-01 | 
+0

Meinten Sie“... die Ärzte für die ihre vorletzte Patienten in Reverse-Erstellung wurde im Jahr 2016 erstellt "? – Richard

+0

Genau wie du gesagt hast, ich werde es ändern. Vielen Dank – AlexLarra

Antwort

3

DEMO

Zuerst verwenden Sie Variable, eine Position zu den einzelnen Patienten zugeordnet werden.

SELECT `id`, `name`, `surgeon_id`, `created_at`, 
     @pos := IF(@surgeon_id = surgeon_id, 
        @pos + 1, 
        IF(@surgeon_id := surgeon_id, 1, 1) 
       ) as rn 
FROM Table1 
CROSS JOIN (SELECT @pos := 0, @surgeon_id :=0) as parameters 
ORDER BY `surgeon_id`, `created_at` DESC 

Dann verwenden Sie das als Unterabfrage, um den vorletzten Patienten zu bekommen und das Jahr zu testen.

SELECT `id`, `name`, `surgeon_id`, `created_at` 
FROM (
     SELECT `id`, `name`, `surgeon_id`, `created_at`, 
       @pos := IF(@surgeon_id = surgeon_id, 
          @pos + 1, 
          IF(@surgeon_id := surgeon_id, 1, 1) 
         ) as rn 
     FROM Table1 
     CROSS JOIN (SELECT @pos := 0, @surgeon_id :=0) as parameters 
     ORDER BY `surgeon_id`, `created_at` DESC 
    ) T 
WHERE T.rn = 2 
    AND YEAR(`created_at`) = 2016 

Schließlich Doktoren Join zurück den Namen

SELECT Doctors.`id`, Doctors.`name` 
FROM (
     SELECT `id`, `name`, `surgeon_id`, `created_at`, 
       @pos := IF(@surgeon_id = surgeon_id, 
          @pos + 1, 
          IF(@surgeon_id := surgeon_id, 1, 1) 
         ) as rn 
     FROM Patients 
     CROSS JOIN (SELECT @pos := 0, @surgeon_id :=0) as parameters 
     ORDER BY `surgeon_id`, `created_at` DESC 
    ) T 
JOIN Doctors 
    ON T.`surgeon_id` = Doctors.`id` 
WHERE T.rn = 2 
    AND YEAR(`created_at`) = 2016; 

OUPUT zu erhalten:

enter image description here

Verwandte Themen