簡體   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