グループごとに「最後の」行が必要な場合は、一意性を定義するフィールド(つまり、「最初/最後の行」の意味)を指定してから、サブクエリでそれらの行を分離する必要があります。
例えば
これにより、各グループの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
もちろん、これはidが一意であり、昇順で割り当てられていることを前提としているため、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