MySQL左连接查询-从三个表中获取数据

MySQL左连接查询-从三个表中获取数据,mysql,left-join,Mysql,Left Join,我在数据库中有以下表格: 表post: +---------------+----------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +---------------+----------------+------+-----+---------+----------------+ | pos

我在数据库中有以下表格:

post

+---------------+----------------+------+-----+---------+----------------+
| Field         | Type           | Null | Key | Default | Extra          |
+---------------+----------------+------+-----+---------+----------------+
| post_id       | int(11)        | NO   | PRI | NULL    | auto_increment |
| post_content  | varchar(50000) | NO   |     | NULL    |                |
| post_date     | datetime       | NO   |     | NULL    |                |
| post_summary  | varchar(1000)  | YES  |     | NULL    |                |
| post_title    | varchar(300)   | NO   |     | NULL    |                |
| post_visitors | int(11)        | NO   |     | NULL    |                |
| user_id       | int(11)        | NO   | MUL | NULL    |                |
| category_id   | int(11)        | NO   | MUL | NULL    |                |
+---------------+----------------+------+-----+---------+----------------+
用户

+---------------+--------------+------+-----+---------+----------------+
| Field         | Type         | Null | Key | Default | Extra          |
+---------------+--------------+------+-----+---------+----------------+
| user_id       | int(11)      | NO   | PRI | NULL    | auto_increment |
| user_image    | varchar(500) | YES  |     | NULL    |                |
| user_name     | varchar(45)  | NO   |     | NULL    |                |
| user_password | varchar(45)  | NO   |     | NULL    |                |
| user_type     | varchar(30)  | NO   |     | NULL    |                |
| user_username | varchar(45)  | NO   |     | NULL    |                |
+---------------+--------------+------+-----+---------+----------------+
注释

+-----------------+--------------+------+-----+---------+----------------+
| Field           | Type         | Null | Key | Default | Extra          |
+-----------------+--------------+------+-----+---------+----------------+
| comment_id      | int(11)      | NO   | PRI | NULL    | auto_increment |
| comment_content | varchar(600) | NO   |     | NULL    |                |
| comment_date    | datetime     | NO   |     | NULL    |                |
| comment_title   | varchar(300) | NO   |     | NULL    |                |
| user_id         | int(11)      | NO   | MUL | NULL    |                |
| post_id         | int(11)      | NO   | MUL | NULL    |                |
+-----------------+--------------+------+-----+---------+----------------+
我需要一个查询,该查询将返回
post\u title
post\u summary
post\u date
number\u of thes\u comments\u for \u this\u post
user\u name
,按
number\u of \u comments\u for\u this\u post
排序

基本上,我需要所有三个表中的数据。我知道如何左键连接两个表并获取一些数据。例如:

SELECT p.post_title, p.post_summary, p.post_date, u.user_name 
FROM post p LEFT JOIN user u ON p.user_id=u.user_id;

如何通过连接第三个表(comment)来扩展此查询,并添加一个字段—“按大多数评论文章的顺序排列的帖子评论数”(desc)?

简单,只需继续使用常规语法即可

select p.post_title, p.post_summary, p.post_date, u.user_name 
from post p 
left join user u 
on p.user_id = u.user_id
left join comment c
on p.post_id = c.post_id
除了一个有用的小帮手:

如果要联接的两个表中的列具有相同的名称,请使用USING() 让你的绝地生活更轻松

select p.post_title, p.post_summary, p.post_date, u.user_name 
from post p 
left join user u 
USING(user_id)
left join comment c
USING(post_id)
像这样的

 SELECT 
  p.post_id,
  p.post_date,
  p.post_summary,
  p.post_title,
  u.user_name,
  COUNT(c.comment_id) AS number_of_post_comments 
FROM
  post p 
  LEFT JOIN COMMENT c 
    ON p.post_id = c.post_id 
  LEFT JOIN USER u 
    ON p.user_id = u.user_id
GROUP BY p.post_id  
ORDER BY number_of_post_comments  DESC
Join只是一个操作符。关系代数只是另一种查询形式。表是一种关系,对它们的操作会产生其他关系。可以使用多个操作生成结果关系。MySQL手册页面也建议这样做

要计算一组行上的一些统计信息,您需要。在这种情况下,您需要
计数

SELECT
    post_title,
    post_summary,
    post_date,
    COUNT(comment_id) AS comment_cnt,
    user.user_name
FROM
    post
    LEFT JOIN user USING(user_id)
    LEFT JOIN comment USING(post_id)
GROUP BY
    post_id
ORDER BY
    comment_cnt DESC

学徒,不要使用USING()。对于较大的查询,它会变得太混乱。当然,这对性能没有好处,但也不是缺点。它的代码更少,通过阅读表格词缀,比如用户u,然后u.x=c.y,我感到头疼。我认为这一点也不令人困惑,但这是一个品味的问题!大型查询无论如何都很难读取,不管它是使用()还是ON语句。用新行格式化您的查询只需将其可读性降低一半…@Steini您没有在结果中包含
number\u of\u posts
comments字段,并且完全按照该字段排序。每个人都有自己的,但使用()肯定是为了黑暗面。@Wlad,是的,我错过了。。。然而,现在有很多人在我面前发布了这些信息,这样他们就可以获得他们应得的代表,我现在真的不需要再调整这些信息了。此查询不返回有效结果。我已将
post
表内容、查询和结果放在文本文件中,您可以在这里看到:报告的thantks。。我更正了我的答案,我希望现在它能工作,即使我不能测试它。@Wlad可能你错过了实用程序。它以SQL查询的形式转储表内容。转储文件易于导入和实验。但是还是更好。@StarsSky是的,现在可以了,只需在末尾添加
desc
。谢谢