[英]MySQL query with LEFT OUTER JOIN and WHERE
我有三个表: stories
, story_types
和comments
以下查询检索stories
表中的所有记录,获取它们的story_types
以及与每个故事相关的评论数:
SELECT s.id AS id,
s.story_date AS datetime,
s.story_content AS content,
t.story_type_label AS type_label,
t.story_type_slug AS type_slug,
COUNT(c.id) AS comment_count
FROM stories AS s
LEFT OUTER JOIN story_types AS t ON s.story_type_id = t.id
LEFT OUTER JOIN comments AS c ON s.id = c.story_id
GROUP BY s.id;
现在,我只想从stories WHERE s.id = 1
(这是主键)中检索记录。 我已经尝试了以下方法,但是它仍然返回所有记录:
SELECT s.id AS id,
s.story_date AS datetime,
s.story_content AS content,
t.story_type_label AS type_label,
t.story_type_slug AS type_slug,
COUNT(c.id) AS comment_count
FROM stories AS s
LEFT OUTER JOIN story_types AS t ON s.story_type_id = t.id
AND s.id = 1
LEFT OUTER JOIN comments AS c ON s.id = c.story_id
GROUP BY s.id;
我还在末尾尝试了WHERE
子句,这将引发错误。
在这种情况下,有人可以指出这种情况的正确语法吗?
我正在使用MySQL 5.1.47。 谢谢。
我猜您将WHERE放在GROUP BY之后,这是非法的。 请参阅有关MySQL中SELECT语法的参考 。 尝试这个:
SELECT
s.id AS id,
s.story_date AS datetime,
s.story_content AS content,
t.story_type_label AS type_label,
t.story_type_slug AS type_slug,
COUNT(c.id) AS comment_count
FROM
stories AS s
LEFT JOIN story_types AS t ON s.story_type_id = t.id
LEFT JOIN comments AS c ON s.id = c.story_id
WHERE
s.id = 1
GROUP BY
s.id;
编者注:我重新格式化了代码以突出显示查询结构
跟进已接受答案的评论:
对我来说,这是不直观的,第二次加入
这只是概述正确的代码格式如何增强理解。 这是我通常格式化SQL的方式:
SELECT
s.id AS id,
s.story_date AS datetime,
s.story_content AS content,
t.story_type_label AS type_label,
t.story_type_slug AS type_slug,
COUNT(c.id) AS comment_count
FROM
stories AS s
LEFT JOIN story_types AS t ON t.id = s.story_type_id
LEFT OUTER JOIN comments AS c ON s.id = c.story_id
WHERE
s.id = 1
GROUP BY
s.id;
WHERE不在第二个联接上。 SELECT语句中只允许有一个WHERE子句,并且它始终是顶层的。
PS:还请注意,在许多数据库引擎(除MySQL外)中,使用GROUP BY子句然后选择列而不通过诸如MIN()
, MAX()
或COUNT()
类对列进行聚合是非法的。 恕我直言,这是不好的作风,也是坏习惯。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.