通知システムを実装しています。私のテーブル構造はこのようなものです..
id (自動インクリメントの主キー)
user_id (通知を表示するユーザーのユーザー ID 、int) trigger_by (
通知をトリガーしたユーザー、int)
post_id (通知が存在する投稿、int)
type (通知のタイプ) , int)
seen (通知を読んだか、bool)
通知を表示済みとしてマークするときは、post_id とタイプを使用しています。つまり、最大の ID を持つ行が表示された場合、その post_id とタイプの以前のすべての行が表示されると安全に想定できます。
ここで、その post_id と type の以前のエントリと組み合わせた行と、その post_id と type に登録されている行の数を取得したいと考えています。私の現在のクエリは
select max(x.id) as id,
x.post_id as post_id,
x.seen as seen,
x.user_id as user_id,
x.triggered_by as triggered_by,
x.type as type,
x.count as count
from (SELECT notification.id,
notification.post_id,
notification.user_id,
notification.triggered_by,
notification.type,
c.count, notification.seen
FROM `notification`
join (select post_id, type, count(id) as count
from notification group by post_id, type) c
on c.type=notification.type
and c.post_id=notification.post_id
Where notification.user_id=1) x
Group by post_id
Order by id desc limit 10
このクエリの問題は、最も外側のクエリの 'group by' 句がランダムな行の 'seen' 列を返していることです。ここで、最大の ID を持つ行からカウントする以外のデータを返す必要があります。