0

我正在尝试开发一个查询

  1. 给出不是由 currentUserID 写入的每个线程中的最后一条消息(现在通过 thread_id 分组完成,按 message_id desc 排序 AND WHERE results.sender_id != currentUserID)
  2. 如果用户启动了一个线程但没有收到响应,则该线程不应该出现(现在只需使用 WHERE results.sender_id != currentUserID 过滤数据即可完成)
  3. 提供一个布尔列来判断是否在此线程中发送了响应(未完成,但将涉及从查询中查找最后一个元素并查看 sender_id 是否=当前登录的用户 id)

http://sqlfiddle.com/#!2/85971/2

概要

  • 用户 1 与用户 2 发送消息
  • 线程 ID:1
  • 主题:“嗨主题”
  • 身体:“嗨身体”

  • 用户 2 回复:

  • 线程 ID:1
  • 身体:“嗨身体反应”

作为用户 1,SQL 应该返回

THREAD_ID |SUBJECT     | SENDER_ID | BODY             | Responded
1         | Hi Subject | 2         | Hi Body Response | false

作为用户 2,SQL 应该返回

THREAD_ID |SUBJECT     | SENDER_ID | BODY    | Responded
1         | Hi Subject | 1         | Hi Body | true

请看小提琴

我对它的拍摄是以下,它需要 1 英亩和 2 英亩,但不是 3 英亩,我试图与 UNIONS 混在一起以实现这一目标,但一无所获。

SELECT * FROM (
    SELECT t.id as thread_id, t.subject, m.sender_id, m.body
    FROM messages m
    JOIN threads t ON (m.thread_id = t.id)
    ORDER BY t.id asc, m.cdate desc
) as results
WHERE results.sender_id != currentUserID
GROUP BY results.thread_id;
4

1 回答 1

1

检查下面的查询。我还添加了消息 ID 列。

第一个结果...

SELECT t.id as thread_id, t.subject, m.sender_id, m.body, m.id,
(SELECT CASE s.status WHEN 1 THEN 'true' ELSE 'false' END 
 FROM STATUS s where s.message_id = m.id and s.user_id = 1) Responded
FROM messages m
JOIN threads t ON (m.thread_id = t.id)
WHERE m.sender_id != 1

第二个...

SELECT t.id as thread_id, t.subject, m.sender_id, m.body, m.id,
(SELECT CASE s.status WHEN 1 THEN 'true' ELSE 'false' END 
 FROM STATUS s where s.message_id = m.id and s.user_id = 2) Responded
FROM messages m
JOIN threads t ON (m.thread_id = t.id)
WHERE m.sender_id != 2

谢谢!

@leo。

于 2013-03-18T01:39:04.220 回答