Я пытаюсь вытащить несколько столбцов из 3 связанных таблиц, но я хочу, чтобы результирующий набор содержал только один отдельный "ввод данных" на p
. id
(идентификатор домашнего животного, который является внешним ключом в данных таблица входа). Проблема заключается в том, что могут быть две записи данных, пронумерованные 1 и 2, принадлежащие домашнему животному - запрос должен просто выбрать запись данных с наибольшим числом - вот почему я пытался использовать max и группу, но это не работает. Может ли кто-нибудь увидеть, где я ошибаюсь? Большое спасибо
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
EDIT: после предложения 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`)
Ваша группа 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
Вы не можете одновременно одновременно выбирать номер и номер МАКС во время группировки. Это связано с тем, что функция 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
Если я правильно понимаю ваш вопрос, вам нужно
LIMIT 1
в конце.