2013-12-02 2 views
0

Это на самом деле часть массивного SQL-запроса, но у меня этот код работает, и теперь я не могу понять, почему он не нашел последнюю запись записи.найти последнюю запись в SQL-запросе

То, что я пытаюсь сделать, это присоединиться ко всем другим назначениям на себя, чтобы узнать, какой из них является последним. И все мои результаты кажутся нулевыми. Но это неверно, потому что у моих данных определенно есть встречи. Поэтому я думаю, что что-то не так с моим выбранным запросом. Любая помощь будет большой.

SELECT `animal_id`, 
     FROM_UNIXTIME(`lastappointment`.`appointmentdata_starttime`,'%D %M %Y') AS 'Last Appointment' 
FROM `animal` 
LEFT JOIN (
    SELECT `lAppointment`.* 
    FROM `appointment` AS `lAppointment` 
    LEFT JOIN `appointment` AS `nlAppointment` 
     ON `nlAppointment`.`appointmentdata_starttime` <= NOW() 
      AND `nlAppointment`.`appointmentdata_starttime` > `lAppointment`.`appointmentdata_starttime` 
      AND `nlAppointment`.`appointmentdata_animal` = `lAppointment`.`appointmentdata_animal` 
    WHERE `lAppointment`.`appointmentdata_starttime` <= NOW() 
     AND `nlAppointment`.`appointment_id` IS NULL 
    ) AS `lastappointment` 
    ON `animal_id` = `lastappointment`.`appointmentdata_animal` 
WHERE `animaldata_active` IS NOT NULL 
GROUP BY animal_id; 
+0

Вы уверены, что 'appointment'.'appointmentdata_animal' такое же, как' animal'.'animal_id'? – cha

+0

yep. destination.appointmentdata_animal - это FK с ограничением на animal.animal_id –

+0

В отсутствие какой-либо сортировки нет «последней» – symcbean

ответ

0

Использование LEFT JOINs для получения MAX() - самый медленный метод, о котором вы можете думать. Я рекомендую вам изменить внутренний запрос, как это (с помощью GROUP BY):

SELECT `animal_id`, 
    FROM_UNIXTIME(`lastappointment`.`last_appointment`, '%D %M %Y') AS 'Last Appointment' 
FROM `animal` 
LEFT JOIN (
    SELECT MAX(appointmentdata_starttime) AS last_appointment, 
     appointmentdata_animal 
    FROM appointment 
    WHERE appointmentdata_starttime <= NOW() 
    GROUP BY appointmentdata_animal 
) AS `lastappointment` 
     ON `animal_id` = `lastappointment`.`appointmentdata_animal` 
WHERE `animaldata_active` IS NOT NULL 
-- GROUP BY animal_id; --BTW, this group_by is not needed 
Смежные вопросы