簡體   English   中英

為什么我的右加入無效?

[英]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的類別的列

UPDATE

我得到它工作與以下查詢︰

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM