Попытка объединить таблицы и выбрать одно отличное максимальное значение - PullRequest
0 голосов
/ 13 августа 2010

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

SELECT `p`.`id`, `o`.`id`, `o`.`email`, MAX(d.number), `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` 
ORDER BY `d`.`number` DESC

РЕДАКТИРОВАТЬ: следуя предложению iniju, я попробовал следующий запрос, но это не отфильтровывает записи данных, число которых меньше, чем другая запись данных для того же питомца:

SELECT `p`.`id`, `o`.`id`, `o`.`email`, `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`, `d`.`number`
HAVING `d`.`number`=MAX(`d`.`number`)

Ответы [ 3 ]

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

Вы не можете одновременно выбрать номер и номер MAX при группировании.Это потому, что функция MAX основана на совокупности вашей группировки.В вашем случае вы также выбираете сам столбец, который будет создавать строку для каждого отдельного числа ... не для каждого отдельного номера MAX.

Допустим, у вас есть 4 строки:

PET    NUMBER
A      1
A      2
B      4
B      2

Вы хотите, чтобы ваш результирующий набор был:

PET  MAX
A    2
B    4

Или вы хотите, чтобы он был:

PET  NUM  MAX
A    1    2
A    2    2
B    4    4
B    2    4

Разница в том, что один группируется и агрегируется, а другой НЕсгруппированы, но содержат агрегированный столбец.

Я предлагаю вам удалить d. number из вашего оператора SELECT, оставив только MAX (d.number). Это решит вашу проблему, если и только если,o. id и o. email уникальны для объединенной записи для p. id

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

SELECT `p`.`id`, `o`.`id`, `o`.`email`, MAX(d.number)
FROM `data_entries` AS `d`
JOIN `pets` `p` ON `p`.`ID` = `d`.`pet_id`
JOIN `owners` `o` ON `o`.`ID` = `p`.`owner_id`
GROUP BY  `p`.`id`, `o`.`id`, `o`.`email`
ORDER BY MAX(d.number) DESC
0 голосов
/ 13 августа 2010

Ваша GROUP BY должна содержать все неагрегированные столбцы, а именно:
GROUP BY 'p'. 'Id', 'o'. 'Id', 'o'. 'Email', 'd'. 'Number'

Полный запрос:

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 
0 голосов
/ 13 августа 2010

Если я правильно понимаю ваш вопрос, вам нужно

LIMIT 1

в конце.

...