【问题标题】:SQL - Return latest comment for every row [duplicate]SQL - 返回每一行的最新评论[重复]
【发布时间】:2016-06-12 11:19:03
【问题描述】:

所以我有两个表,一个有所有数据,另一个有一个 cmets 列表,我需要为数据表中的每一行加载最新评论。这是它的样子

表:queries

id    | name       |
--------------------
1     | John Doe   |
2     | Jane Doe   |
3     | Alex Smith |

表:messages

id    | queriesId  | comment     | dateAdded           |
--------------------------------------------------------
1     | 1          | Comment 1   | 2016-06-12 15:00:08 |
2     | 1          | Commetn 2   | 2016-06-12 15:01:08 |
3     | 2          | Comment 3   | 2016-06-12 15:05:35 |
4     | 2          | Comment 4   | 2016-06-12 15:06:35 |

我希望结果看起来像这样

id    | name       | comment     | dateAdded           |
--------------------------------------------------------
1     | John Doe   | Commetn 2   | 2016-06-12 15:01:08 |
2     | Jane Doe   | Comment 4   | 2016-06-12 15:06:35 |
3     | Alex Smith | Null        | Null                |

我试过这段代码

SELECT
  a.*,
  b.comment,
  b.LastComment
FROM
  queries a
LEFT JOIN
  (
  SELECT
    `comment`,
    MAX(dateAdded) LastComment,
      queriesid
  FROM
    messages
  GROUP BY
    queriesid
) b ON a.id = b.queriesid
GROUP BY
  a.id

但我得到的结果是这样的

id    | name       | comment     | dateAdded           |
--------------------------------------------------------
1     | John Doe   | Commetn 1   | 2016-06-12 15:01:08 |
2     | Jane Doe   | Comment 3   | 2016-06-12 15:06:35 |
3     | Alex Smith | Null        | Null                |

所以唯一的问题是注释是第一个条目,而不是与日期时间列值对应的条目。我已经尝试了很多改变,但它似乎并没有奏效。我敢肯定,这离工作只是一个小小的调整,但我似乎找不到它。

有什么想法吗?

【问题讨论】:

  • 您使用的是哪个 dbms? mysql还是sql server?
  • `comment` 上的反引号看起来像 MySQL。
  • 对不起,不应该选择两个标签,它是 mysql

标签: mysql


【解决方案1】:

与您一样,在您的子查询中选择最大日期和 queryId。然后在日期和 ID 上再次加入消息以获取评论。

编辑:像这样

SELECT
  a.*,
  b.LastComment,
  comment.comment
FROM
  queries a
LEFT JOIN
  (
  SELECT
    MAX(messages.dateAdded) LastComment,
    messages.queriesid
  FROM
    messages
GROUP BY
    queriesid
) b ON a.id = b.queriesid
LEFT JOIN messages AS comment 
    ON comment.dateAdded = b.LastComment 
    AND comment.queriesid = b.queriesid
GROUP BY
  a.id

【讨论】:

  • 你能举个例子吗?我是 mysql 新手,如何自行加入表?我也看到了标记的重复答案,但它完全不同,因为它只适用于一张桌子
  • 编辑了我的答案:)
  • 我知道你在那里做了什么。杰出的。非常感谢
  • 我认为您可以从消息中选择 MAX(id) 而不是日期。 id 是数据库可以使用索引进行第二次连接的主键。你应该试一试。
  • 是的,也可以。我试过....ON comment.id = b.LastComment GROUP BY.....。我应该选择哪一个?我认为这两种情况都不会带来任何性能优势。
猜你喜欢
  • 2016-08-03
  • 1970-01-01
  • 1970-01-01
  • 2012-05-07
  • 1970-01-01
  • 1970-01-01
  • 2011-04-29
  • 1970-01-01
  • 2012-03-30
相关资源
最近更新 更多