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
。谢谢