我有三张桌子:
Message_Threads: ( thread_ID )
Message_Users: ( thread_ID, user_ID, notify )
Messages: ( thread_ID, user_ID, message_ID, date_created )
我试图按线程中最近消息的顺序列出线程,但是我想显示那些在其余部分之上有notify = 1的线程(对于线程上的所有其他用户,notify设置为1)当发布新消息并在访问该线程时将其设置为0)。有人给我一个怪物选择声明吗?
答案 0 :(得分:1)
您的数据结构不明确关系是消息和消息用户。我的假设是这些都连接在thread_id和user_id上。然后,它会在线程级别汇总它们:
select t.thread_id
from thread t join
message m
on t.thread_id = m.thread_id join
message_users mu
on m.thread_id = mu.thread_id and
m.user_id = mu.user_id
group by thread_id
order by max(mu.notify) desc, max(m.date_created) desc
关键是最终的顺序。通过先通知排序,但是降序使“1”出现在“0”之前(假设非1值为0)。然后按创建日期。
要将此限制为特定用户,请在组之前使用WHERE语句:
WHERE u.user_id = session_user_id