mysql - 我如何使用 join 编写等效的 sql 查询?

标签 mysql sql

原始 sql 查询:

SELECT *
FROM
  (SELECT p.id,
          p.title,
          p.mark,

     (SELECT max(created)
      FROM comments c
      WHERE c.post_id=p.id
        AND c.mark=1) AS latest_at
   FROM posts p) AS Post
WHERE Post.latest_at IS NOT NULL
ORDER BY latest_at DESC LIMIT 10

我正在尝试使用 join 编写等效的 sql 查询。我该怎么做?

mysql> describe posts;
+-------------+--------------+------+-----+---------+----------------+
| Field       | Type         | Null | Key | Default | Extra          |
+-------------+--------------+------+-----+---------+----------------+
| id          | int(11)      | NO   | PRI | NULL    | auto_increment |
| user_id     | int(11)      | NO   |     | NULL    |                |
| title       | varchar(255) | NO   |     | NULL    |                |
| body        | text         | YES  |     | NULL    |                |
| category_id | int(11)      | YES  |     | NULL    |                |
| tags        | varchar(50)  | YES  |     | NULL    |                |
| mark        | tinyint(4)   | NO   |     | 1       |                |
| created     | datetime     | YES  |     | NULL    |                |
| modified    | datetime     | YES  |     | NULL    |                |
+-------------+--------------+------+-----+---------+----------------+

mysql> describe comments;
+----------+--------------+------+-----+---------+----------------+
| Field    | Type         | Null | Key | Default | Extra          |
+----------+--------------+------+-----+---------+----------------+
| id       | int(11)      | NO   | PRI | NULL    | auto_increment |
| post_id  | int(11)      | NO   | MUL | NULL    |                |
| name     | varchar(255) | NO   |     | NULL    |                |
| email    | varchar(255) | NO   |     | NULL    |                |
| body     | varchar(500) | NO   |     | NULL    |                |
| mark     | tinyint(4)   | NO   |     | 1       |                |
| created  | datetime     | YES  |     | NULL    |                |
| modified | datetime     | YES  |     | NULL    |                |
+----------+--------------+------+-----+---------+----------------+

任何答案将不胜感激。提前致谢。

最佳答案

试试这个:

SELECT p.id, p.title, p.mark,
       c.latest_at     
FROM posts p
LEFT JOIN (
   SELECT post_id, MAX(created) AS latest_at
   FROM comments
   WHERE mark = 1
   GROUP BY post_id 
) AS c ON c.post_id = p.id 
WHERE c.latest_at IS NOT NULL
ORDER BY c.latest_at DESC LIMIT 10

或者只是这样:

SELECT p.id, p.title, p.mark,
       c.latest_at     
FROM posts p
INNER JOIN (
   SELECT post_id, MAX(created) AS latest_at
   FROM comments
   WHERE mark = 1
   GROUP BY post_id 
) AS c ON c.post_id = p.id 
ORDER BY c.latest_at DESC LIMIT 10

因为第一个查询的 WHERE 子句的 c.latest_at IS NOT NULL 谓词将 LEFT JOIN 变成了 INNER加入

关于mysql - 我如何使用 join 编写等效的 sql 查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35394034/

相关文章:

mysql - 如何在某些参数为空的情况下编写基于 JPA 注释的选择查询

php - 图片上传无效

sql - 左连接后如何找到重复的记录\值?

mysql - 我可以维护 INNER JOIN 的输出根据左侧表(第一个表)的顺序进行排序吗?

c# - 选择第一个记录每个组

php - mysql 拒绝在第一个值之前插入转义斜杠

mysql - 在 mysql jdbc 中,自动提交会影响所有连接吗?

sql - 判断一行数据是否已更改的简单方法是什么?

sql - 将输出 Insert._ID 的值存储到局部变量以在另一个查询中重用它

sql - 我可以仅在一个查询中执行此操作吗?