Определение, который запись возвратиться из пункта GROUP BY

РЕДАКТИРОВАНИЕ ДЛЯ РАЗЪЯСНЕНИЯ

Я, вероятно, неправильно понимаю использование GROUP BY таким образом, я просто перефразирую свой вопрос, не делая предположения о том, как решить проблему:

У меня есть список term_ids и таблица, содержащая объекты (которые имеют 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
5
задан Matteo Riva 3 February 2010 в 12:00
поделиться

4 ответа

ВЫБЕРИТЕ *... 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

Что-то вроде этого?

8
ответ дан 13 December 2019 в 05:34
поделиться

Я не хочу повторять то, что говорят другие ответы, но хотел бы добавить небольшую информацию о группировке SQL, которая может помочь ...

подумайте о том, что результат запроса строится в следующем порядке:

FROM & JOIN определение и фильтрация строк
WHERE дополнительные фильтры для этих строк
GROUP BY объединяет эти строки в группы (теперь по одной строке на группу)
HAVING фильтрует группы на уровне группы
ORDER BY упорядочивает оставшиеся строки / группы

1
ответ дан 13 December 2019 в 05:34
поделиться

GROUP BY должны использоваться с совокупными функциями, такими как count, sum, avg и т.д.. Например:

 select product_name, sum(price) 
 from product_sales
 group by product_name
0
ответ дан 13 December 2019 в 05:34
поделиться

Не из тех примеров, которые вы разместили, правильный 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
3
ответ дан 13 December 2019 в 05:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: