Группируйте и получайте последнюю строку

Когда я использовал

SELECT * FROM reports WHERE staff='$username' GROUP BY taskid 

по моему запросу, я получаю результат первой строки из этой группы.

Что мне нужно добавить, чтобы получить результат из последней строки этой группы?

последняя строка означает, что идентификатор больше, чем другая строка из этой группы.

Я попробовал добавить

 ORDER BY id DESC 

или

 ORDER BY id 

но он не вернул ожидаемый результат.

Вы используете группу по функциям без каких-либо агрегатных функций. Вы, вероятно, захотите сделать заказ вместо этого (в запросе нет группы):

 SELECT * FROM reports WHERE staff='$username' order BY taskid desc; 

Групповые функции обычно используются, когда вы хотите использовать агрегированную функцию в определенном столбце (например, получить среднее значение строки или сумму) и тому подобное. Если вы не используете какую-либо функцию агрегата, то использование Group By ничего не сделает.

Если вы хотите получить только одну строку из запроса, вы можете добавить предложение ограничения следующим образом:

 SELECT * FROM reports WHERE staff='$username' order BY taskid desc limit 1; 

если вы хотите «последнюю» строку на группу , то вам нужно указать, какое поле определяет уникальность (то есть то, что вы подразумеваете под «первой / последней строкой»), а затем изолировать эти строки в подзапросе.

например

это дает вам max (id) для каждой группы

 SELECT taskid, max(id) as max_id FROM reports WHERE staff ='$username' GROUP BY taskid 

и это получает всю строку (строки):

 select * from reports where id in ( SELECT max(id) as max_id FROM reports WHERE staff='$username' GROUP BY taskid ) x 

Это, конечно, предполагает, что идентификатор уникален и назначается в порядке возрастания, и поэтому max (id) указывает последнюю строку на группу.

В качестве альтернативы вы можете переписать это с помощью соединения:

 select * from reports r inner join ( SELECT max(id) as max_id FROM reports WHERE staff='$username' GROUP BY taskid ) x on r.id = x.max_id