[英]Why my right join isn't working?
我需要顯示所有類別,甚至沒有項目的類別。
我有這個查詢。
SELECT
i.id,
incident_active 'Approved',
incident_verified 'Verified',
category_title 'Category',
ParentCategory 'Parent Category'
FROM
incident i
INNER JOIN
incident_category ic ON i.id = ic.incident_id
RIGHT JOIN
incident_person ip ON i.id = ip.incident_id
RIGHT JOIN
(SELECT
c1.id,
c1.parent_id,
c2.category_title ParentCategory,
CONCAT_WS(' -> ', c2.category_title, c1.category_title) category_title
FROM
category c1
left outer join category c2 ON c1.parent_id = c2.id WHERE c1.parent_id != 0) AS c ON c.id = ic.category_id
WHERE incident_dateadd > DATE_SUB(NOW(), INTERVAL 1 MONTH)
哪個返回:
和這個查詢:
SELECT
c1.id,
c1.parent_id,
c2.category_title ParentCategory,
CONCAT_WS(' -> ', c2.category_title, c1.category_title) category_title
FROM
category c1
left outer join category c2 ON c1.parent_id = c2.id WHERE c1.parent_id != 0
哪個返回:
我已經讀過幾次這個答案,但我看不到為什么我的正確聯接無法正常工作。
第一個結果集應再有8列,其父類別為Protesta
的類別的列
我得到它工作與以下查詢︰
SELECT * FROM (SELECT
i.id,
incident_title 'Título',
incident_description 'Descripción',
incident_date 'Fecha',
incident_active 'Aprobado',
incident_verified 'Veficado',
person_first 'Nombres',
person_last 'Apellidos',
person_email 'Email',
category_id
-- category_title 'Categoría',
-- ParentCategory 'Categoría Padre'
FROM
incident i
INNER JOIN
incident_category ic ON i.id = ic.incident_id
RIGHT JOIN
incident_person ip ON i.id = ip.incident_id
WHERE (incident_dateadd > DATE_SUB(NOW(), INTERVAL 1 MONTH) OR incident_dateadd IS NULL)) a
RIGHT JOIN
(SELECT
c1.id,
c1.parent_id,
c2.category_title ParentCategory,
CONCAT_WS(' -> ', c2.category_title, c1.category_title) category_title
FROM
category c1
left outer join category c2 ON c1.parent_id = c2.id WHERE c1.parent_id != 0) b ON a.category_id = b.id
盡管我仍然不明白為什么它不能與第一個版本一起使用,但是在我看來,這兩個查詢是等效的。
如果有人能解釋差異...
這是您最終的where
子句的位置。
在拳頭查詢中,您拉出所有類別並將它們與一堆數據相關聯,從而獲得行的匯編。 然后,您可以使用where子句過濾掉其中的許多行,其中一些恰好是類別行。
讓我們看一個簡單的例子。
Table A:
X | Y
-----
1 | hi
2 | bye
3 | what
Table B:
Z | X
-----
A | 1
B | 1
C | 2
給定這些表,如果我說以下
SELECT * FROM `B` RIGHT JOIN `A` ON A.X = B.X
我的結果將是:
Z | X | Y
---------
A | 1 | hi
B | 1 | hi
C | 2 | bye
- | 3 | what
但是,如果在該語句的末尾添加了where子句,則查詢變為
SELECT * FROM `B` RIGHT JOIN `A` ON A.X = B.X WHERE B.Z > 'A'
表A中的一些被過濾掉了。 我現在有:
Z | X | Y
---------
B | 1 | hi
C | 2 | bye
但是 ,如果我的查詢在聯接之前進行了過濾,如下所示:
SELECT * FROM
(SELECT * FROM `B` WHERE B.Z > 'A') AS B
RIGHT JOIN `A` ON A.X = B.X
我的表格仍然包含A
中的所有行。
Z | X | Y
---------
B | 1 | hi
C | 2 | bye
- | 3 | what
這只是秩序問題。 在原始查詢中,選擇所有行,然后過濾掉一些行。 在工作查詢中,首先進行過濾,然后獲得所需的所有類別行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.