РЕДАКТИРОВАНИЕ ДЛЯ РАЗЪЯСНЕНИЯ
Я, вероятно, неправильно понимаю использование GROUP BY
таким образом, я просто перефразирую свой вопрос, не делая предположения о том, как решить проблему:
У меня есть список term_id
s и таблица, содержащая объекты (которые имеют object_id
PK и term_id
как FK среди других полей), я должен извлечь объект с самым высоким object_id
для каждого term_id
предоставленный. Что корректный путь состоит в том, чтобы сделать это?
ИСХОДНЫЙ ВОПРОС
Я уверен, что пропускаю что-то очевидное, но я не могу выяснить, как указать, какая запись будет возвращена запросом с a GROUP BY
. По умолчанию GROUP BY
возвращает первую запись в группе, которая я могу получить последний вместо этого, не используя подзапрос?
Основной запрос возвращает первую запись:
SELECT *
FROM wp_term_relationships
WHERE term_taxonomy_id IN (20, 21, 22)
GROUP BY term_taxonomy_id
это работает, но с подзапросом
SELECT *
FROM (
SELECT *
FROM wp_term_relationships
WHERE term_taxonomy_id IN (20, 21, 22)
ORDER BY object_id DESC
) wtt
GROUP BY term_taxonomy_id
это - синтаксическая ошибка
SELECT *
FROM wp_term_relationships
WHERE term_taxonomy_id IN (20, 21, 22)
ORDER BY object_id DESC
GROUP BY term_taxonomy_id
ВЫБЕРИТЕ *... GROUP BY
не должен работать. Тот факт, что ваш первый пример работает - это зависящая от MySQL особенность.
Для того, чтобы GROUP BY заработала, ваш пункт SELECT не может быть *
. Оно должно быть смесью столбцов GROUP BY и функций "агрегирования", таких как COUNT
, SUM
и т.п.
SELECT COUNT(*), some_column FROM... GROUP by some_column
- это ожидаемая форма.
SELECT *
не ожидается.
Вы хотите найти самый высокий объект_ид для каждого термина_ид.
SELECT MAX(term_id), object_id FROM some_table GROUP BY object_id
Что-то вроде этого?
Я не хочу повторять то, что говорят другие ответы, но хотел бы добавить небольшую информацию о группировке SQL, которая может помочь ...
подумайте о том, что результат запроса строится в следующем порядке:
FROM & JOIN определение и фильтрация строк
WHERE дополнительные фильтры для этих строк
GROUP BY объединяет эти строки в группы (теперь по одной строке на группу)
HAVING фильтрует группы на уровне группы
ORDER BY упорядочивает оставшиеся строки / группы
GROUP BY
должны использоваться с совокупными функциями, такими как count
, sum
, avg
и т.д.. Например:
select product_name, sum(price)
from product_sales
group by product_name
Не из тех примеров, которые вы разместили, правильный T-SQL. Вы не можете SELECT *
при использовании пункта GROUP BY
.
GROUP BY
не возвращает первую запись в группе - она агрегируется по столбцам, указанным в пункте (также есть столбцы, которые Вы можете использовать в пункте SELECT
). В пункте
SELECT SELECT
необходимо использовать функцию агрегации (например, SUM или COUNT или MAX). Вы не указали, какой агрегат вы пытаетесь получить, поэтому я буду использовать COUNT в моем примере для количества записей:
SELECT COUNT(term_taxonomy_id)
FROM wp_term_relationships
WHERE term_taxonomy_id IN (20, 21, 22)
GROUP BY term_taxonomy_id