提供布尔类型的额外返回列,用于评估另一个查询

时间:2013-03-18 01:19:47

标签: mysql sql join union

我正在尝试开发一个

的查询
  1. 在currentUserID未写入的每个线程中给出最后一条消息(现在通过thread_id按组完成,按message_id desc和WHERE results.sender_id!= currentUserID命令)
  2. 如果用户启动了一个线程但没有收到任何响应,则该线程不应该显示(现在只需使用WHERE results.sender_id!= currentUserID过滤数据即可完成)
  3. 提供一个布尔列,以告知是否在此线程中发送了响应(未完成,但会涉及从查询中查找最后一个元素,并查看sender_id是否=当前登录的用户ID)
  4. 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;
    

1 个答案:

答案 0 :(得分: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。