Tôi nghĩ những điều sau đây sẽ làm những gì bạn muốn:
SELECT *, (To_days(date_expires)-TO_DAYS(NOW())) as dayDiff, COUNT(id) AS change_count
FROM mytable
GROUP BY (case when source_id is null then id else source_id end)
HAVING dayDiff < 4
ORDER BY (case when source_id is null then 1 else 0 end), date_created DESC
Nó thực hiện một nhóm group by
vì vậy các nguồn NULL sẽ không được nhóm lại. Sau đó, nó đặt chúng cuối cùng bằng cách sử dụng logic theo thứ tự order by
.
Tôi không hiểu ý của bạn về lần xuất hiện cuối cùng. Bây giờ tôi nghĩ tôi làm:
SELECT coalesce(s.id, mytable.id) as id,
max(case when s.maxid is not null and s.maxid = myable.id then mytable.name
when s.maxid is null then NULL
else mytable.name
end) as name,
(To_days(date_expires)-TO_DAYS(NOW())) as dayDiff, COUNT(id) AS change_count
FROM mytable left outer join
(select source_id, MAX(id) as maxid
from mytable
where source_id is not null
group by source_id
) s
on mytable.id = s.maxid
GROUP BY (case when source_id is null then id else source_id end)
HAVING dayDiff < 4
ORDER BY (case when source_id is null then 1 else 0 end), date_created DESC
Điều này kết hợp với thông tin từ bản ghi mới nhất (dựa trên id cao nhất).