繁体   English   中英

使用LEFT OUTER JOIN和WHERE的MySQL查询

[英]MySQL query with LEFT OUTER JOIN and WHERE

我有三个表: storiesstory_typescomments

以下查询检索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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM