Имею вот такую таблицу calls
id | clientid | salespersonid | duration | statusid | last_update
1 | c11 | sp99 | 05:00 | 1 | yyyy
2 | c11 | sp99 | 06:00 | 1 | yyyy
3 | c11 | sp99 | 07:00 | 3 | yyyy
4 | c12 | sp99 | 08:00 | 3 | yyyy
Я выполняю этот запрос, чтобы подсчитать количество звонков на одного клиента для каждого продавца.
select *,count(wpc.id) as num_of_calls
from calls wpc
where wpc.salespersonid=?
group by wpc.clientid
order by wpc.last_update desc
Это возвращает этот результат
id | clientid | salespersonid | duration | statusid | last_update|num_of_calls
1 | c11 | sp99 | 05:00 | 1 | yyyy |3
4 | c12 | sp99 | 08:00 | 3 | yyyy |1
С запросом все в порядке, но меня не устраивает порядок, в котором программа считает и отображает строки. Он отображает первую строку подсчета. Я хочу, чтобы отображалась последняя строка каждого счетчика.
Так что результат должен быть
id | clientid | salespersonid | duration | statusid | last_update|num_of_calls
3 | c11 | sp99 | 07:00 | 3 | yyyy |3
4 | c12 | sp99 | 08:00 | 3 | yyyy |1
Как я могу отобразить последнюю строку каждого счетчика вместо первой?
@ 7Reeds: Да, если он правильно возвращает num_of_calls. Да.
Вы не можете гарантировать ни того, ни другого с таким запросом. Хотя обычно получается, что неагрегированные негруппированные поля - это первые встречается в MySQL; MySQL совсем не гарантирует этого. Любые неагрегированные негруппированные поля следует рассматривать как случайный выбор значений этих полей с сгруппированной комбинацией полей ... SELECT a, b, c FROM t GROUP BY a даже не гарантирует, что b и c будут из одной строки. Если вам нужна последняя (или первая строка) каждой группы, вам обычно нужен подзапрос, который идентифицирует эту строку, который затем объединяется для получения этой строки.
Этот запрос НЕ в порядке !!!
@ Клубника: Хорошо? Не могли бы дать более подробную информацию? Кстати, MAX по-прежнему будет возвращать те же строки 1 и 4. Желаемый результат - строки 3 и 4.
@Uueerdo: Спасибо за этот звуковой комментарий. Не могли бы вы показать это мне? Я пробовал с MAX, и он не работает.
Это потому, что вы не изучили принятый ответ на связанный вопрос.
Ответ, связанный с @Strawberry, охватывает именно то, о чем вы спрашиваете.






Дубликат Совместное использование ORDER BY и GROUP BY
Использование решения: https://stackoverflow.com/a/35053900/2397717
SELECT wpc.*, COUNT(wpc.id) AS num_of_calls FROM (SELECT * FROM calls ORDER BY last_update DESC) as wpc GROUP BY wpc.clientid
Нет, это не работает должным образом. Я только что это проверил.
Вот рабочий рабочий пример
Он по-прежнему возвращает строку 1 и строку 4. Он должен возвращать строки 3 и 4.
Теперь он должен работать.
Подойдет ли вам пункт
limit?