Group-wise-max - справка по иерархическим запросам данных - PullRequest
0 голосов
/ 13 августа 2010

Первая часть этой проблемы была решена вчера хорошей помощью, но сегодня я изо всех сил пытался выполнить нужный мне запрос.Я пытаюсь получить несколько столбцов из 5 соединенных таблиц на основе некоторых условий, но я хочу, чтобы набор результатов содержал только одну отдельную «запись данных» на p.id (идентификатор питомца, который является внешним ключом в таблице ввода данных)- этот data_entry должен иметь наибольшее число всех data_entries с этим p.id (то есть конкретный питомец может иметь data_entries с номерами 1,2 и 3 - я хочу только номер 3).У меня приведенный ниже код работает правильно в первом запросе, но я хочу добавить дополнительное предложение, которое проверяет «обновленную» дату возвращенной максимальной записи, но я не могу понять, как правильно интегрировать это предложение.

Любая помощь будет принята с благодарностью:

Этот упрощенный запрос корректно работает для 3 объединенных таблиц (без условия сравнения дат)

SELECT `p`.`id`, `o`.`id`, `o`.`email`, MAX(d.number) 
FROM (`pets` AS `p`, `owners` AS `o`, `data_entries` AS `d`) 
WHERE `p`.`owner_id` = `o`.`id` 
AND `p`.`id` = `d`.`pet_id` 
GROUP BY `p`.`id`, `o`.`id`, `o`.`email` 
ORDER BY `d`.`number` DESC 

Однако, когда я пытаюсьдобавив приведенное ниже условие сравнения даты и объединения между дополнительными таблицами, запрос не выполняет сравнение даты с «обновленным» столбцом data_entry с номером MAX, а проверяет наименьшее число.

SELECT `p`.`id` AS `pet_id`, `o`.`id` AS `owner_id`, `o`.`email`, MAX(d.number) 
FROM (`pets` AS `p`, `owners` AS `o`, `data_entries` AS `d`, `k_records_owners` AS `kcro`, `k_records` AS `kcr`) 
WHERE `p`.`owner_id` = `o`.`id` 
AND `p`.`id` = `d`.`pet_id` 
AND `p`.`kc_number` = `kcr`.`do_dg_dog_no` 
AND `kcr`.`pa_breeder_no` = `kcro`.`contact_no` 
AND FROM_UNIXTIME(`d`.`updated`, "%Y-%m-%d") <= DATE_FORMAT(DATE_SUB(NOW(), INTERVAL 25 day), "%Y-%m-%d") 
GROUP BY `p`.`id`, `o`.`id`, `o`.`email` 
ORDER BY MAX(d.number) DESC

РЕДАКТИРОВАТЬ: последняя попытка - приводит к появлению неизвестного столбца «d2.updated» в «имеющем предложение»

SELECT p.id AS pet_id, o.id AS owner_id, o.email, MAX(d.number) as max_d, d.updated 
FROM (pets AS p, owners AS o, data_entries AS d, data_entries AS d2, kennel_club_records_owners AS kcro, kennel_club_records AS kcr)
WHERE p.owner_id = o.id 
AND p.id = d.pet_id 
AND p.kc_number = kcr.do_dg_dog_no 
AND kcr.pa_breeder_no = kcro.contact_no 
AND d.number = d2.number
GROUP BY p.id, o.id, o.email 
having FROM_UNIXTIME(d2.updated, '%Y-%m-%d') <= DATE_FORMAT(DATE_SUB(NOW(), INTERVAL 25 day), '%Y-%m-%d') 
ORDER BY max_d DESC

1 Ответ

0 голосов
/ 13 августа 2010

попробуйте это:

SELECT p.id AS pet_id, o.id AS owner_id, o.email, MAX(d.number) as max_d, d.updated 
FROM (pets AS p, owners AS o, data_entries AS d, data_entries AS d2, kennel_club_records_owners AS kcro, kennel_club_records AS kcr)
WHERE p.owner_id = o.id 
AND p.id = d.pet_id 
AND p.kc_number = kcr.do_dg_dog_no 
AND kcr.pa_breeder_no = kcro.contact_no 
AND d2.number = max_d
AND FROM_UNIXTIME(d2.updated, '%Y-%m-%d') <= DATE_FORMAT(DATE_SUB(NOW(), INTERVAL 25 day), '%Y-%m-%d') 
GROUP BY p.id, o.id, o.email 
ORDER BY max_d DESC
...