Попытка объединить таблицы и выбрать одно отличное максимальное значение

0

Я пытаюсь вытащить несколько столбцов из 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`)
Теги:
greatest-n-per-group

3 ответа

0
Лучший ответ

Ваша группа 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
    На самом деле, вы, вероятно, должны удалить 'd'. 'Number' как из SELECT, так и из GROUP BY.
  • 0
    Привет, iniju - я обновил запрос с вашим предложением, но мне нужно отфильтровать любые результаты, которые имеют одинаковый pet_id - я имею в виду только выбрать data_entry с наибольшим числом
Показать ещё 10 комментариев
2

Вы не можете одновременно одновременно выбирать номер и номер МАКС во время группировки. Это связано с тем, что функция 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

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

LIMIT 1

в конце.

  • 1
    Ах, но это ограничит запрос только одним результатом
  • 0
    Хорошо. Я думал, что это было слишком просто, я точно не понимаю вашего вопроса.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню