[英]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.