2016-12-20 3 views
1

Я пытаюсь выбрать записи с одинаковым session_id и следующей MySQL заявлением работы:Выберите более 1 MySQL поля с COUNT заявлением

SELECT session_id, COUNT(session_id) AS NumOccurrences 
FROM my_table 
GROUP BY session_id 
HAVING COUNT(*) > 0 

Однако я могу получить доступ только session_id, а не какое-либо ofther поле. Я пробовал что-то вроде:

SELECT session_id, other_filed COUNT(session_id) AS NumOccurrences 
FROM my_table 
GROUP BY session_id 
HAVING COUNT(*) > 0 

но он не работает. Также попытался *, но также не работает:

SELECT * COUNT(session_id) AS NumOccurrences 
FROM my_table 
GROUP BY session_id 
HAVING COUNT(*) > 0 

Помогите мне решить эту проблему?

+0

Похоже, вы пропустили ',' перед 'COUNT'. –

+1

Отсутствует запятая после _other_filed_. Однако из-за группы по ней всегда будет отображаться только одна строка за сеанс_ид – baao

+0

А, я вижу - поскольку другие поля разные, он не может вернуть одно значение ... – Vonder

ответ

2

Ваш запрос генерирует совокупный результирующий набор, и вы пытаетесь одновременно отобразить значение детализации (значение из исходной таблицы, а не совокупности).

Так что если вы попробуете это, вы получите что-то. ANY_VALUE() tells MySQL explicitly to choose some single value от other_field за каждое значение session_id.

SELECT COUNT(session_id) AS NumOccurrences, 
     ANY_VALUE(other_field) 
    FROM my_table 
GROUP BY session_id 

Будьте осторожны с the ANY_VALUE() function: это действительно должно быть названо SURPRISE_ME(). Он возвращает значение некоторой строки в группе GROUP BY. Какая строка возвращается, полностью зависит от сервера MySQL. Это не случайное значение, это хуже, чем это. Он возвращает одно и то же значение каждый раз, когда вы запускаете запрос, пока он этого не сделает. Он может измениться или нет, когда таблица растет или сжимается, или когда сервер имеет больше или меньше ОЗУ, или когда версия сервера изменяется, или когда Марс находится в ретроградном состоянии, что бы это ни значило. Вы были предупреждены.

Вы также могли бы сделать

SELECT COUNT(session_id) AS NumOccurrences, 
     GROUP_CONCAT(DISTINCT other_field ORDER BY other_field) 
    FROM my_table 
GROUP BY session_id 

, чтобы получить список значений для other_field.

Кроме того, HAVING COUNT(*) > 0 является избыточным. Нет никакого способа, чтобы определенное значение session_id отображалось в вашем результирующем наборе, если оно не отображается, по крайней мере, в одной строке таблицы.

Смежные вопросы