【问题标题】:MySQL: Displaying the last child of the top 5 parent rows (no repeated parents)MySQL:显示前 5 个父行的最后一个子行(没有重复的父行)
【发布时间】:2018-03-16 17:39:47
【问题描述】:

我正在尝试获取用户回复的最后 5 条消息。查询结果中不能重复用户:

SELECT
message.id_message AS id_message, message.message AS message,
user.id_user AS id_user, user.name AS name, user.lastname AS lastname
FROM user
    JOIN message ON message.id_user = user.id_user
    JOIN reply ON reply.id_message = message.id_message
WHERE
    user.flg_ban IS NULL
    AND
    message.id_message IN (SELECT MAX(id_message) FROM message GROUP BY id_user)
    AND
    reply.id_reply IS NOT NULL
GROUP BY user.id_user
ORDER BY message.id_message DESC LIMIT 5

结果应该是:

    1. Skyler:这是给 Skyler 的唯一消息
    1. 杰西:给杰西的第三条信息
    1. Walter:给 Walter 的第二条信息

由于某种原因,我只获得了一条记录。

结构的小提琴:http://sqlfiddle.com/#!9/1f114b/1

【问题讨论】:

  • 你的 sqlfiddle 是错误的 .. 你已经使用了起始表格 6 但 user_id 与 1, 2 相关......所以是不完整的
  • sqlfiddle.com/#!9/9452a/2 只是一个示例 .. 我没有评估相应的名称和 id 。对于不同的结果使用 distinct 子句而不是 group by
  • @scaisEdge 抱歉,链接已更新
  • 在实际的 sqlfiddle 中有 3 条记录 .. 就像你的问题 .. 解释得更好,就像我的 sql fiddle 中一样

标签: mysql sql group-by


【解决方案1】:

嗯。 . .

SELECT m.id_message, m.message, u.id_user, u.name, u.lastname, u.facebook_id AS facebook_id
FROM user u JOIN
     message m
     ON m.id_user = u.id_user
WHERE u.flg_ban IS NULL AND
      EXISTS (SELECT 1 FROM reply r WHERE r.id_message = m.id_message) AND
      m.id_message >= COALESCE((SELECT m2.id_message
                                FROM message m2
                                WHERE m2.id_user = m.id_user AND
                                      EXISTS (SELECT 1 FROM reply r2 WHERE r2.id_message = m2.id_message)
                                ORDER BY m2.id_message DESC
                                LIMIT 4, 1
                               ), 0
                              );

请注意,表别名使查询更易于编写和阅读。

我认为这是您想要的非常直接的翻译。唯一的小怪癖是使用LIMIT 4, 1 来获得第五大id_message。 MySQL 不支持带有相关子查询的 IN,因此这是一种方便的解决方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多