簡體   English   中英

MYSQL外連接,不返回不匹配的行

[英]MYSQL outer join, doesn't return non-matching rows

我的數據庫中有這兩個表

describe external_review_sources;
+-------+--------------+------+-----+---------+----------------+
| Field | Type         | Null | Key | Default | Extra          |
+-------+--------------+------+-----+---------+----------------+
| ersID | int(11)      | NO   | PRI | NULL    | auto_increment |
| name  | varchar(50)  | NO   | UNI | NULL    |                |
| logo  | varchar(255) | NO   |     | NULL    |                |
+-------+--------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)

describe listing_external_review_source_rel;
+---------+--------------+------+-----+---------+----------------+
| Field   | Type         | Null | Key | Default | Extra          |
+---------+--------------+------+-----+---------+----------------+
| lersrID | int(11)      | NO   | PRI | NULL    | auto_increment |
| bid     | int(10)      | NO   |     | NULL    |                |
| url     | varchar(255) | NO   |     | NULL    |                |
| ersID   | int(11)      | YES  |     | NULL    |                |
| active  | int(10)      | NO   |     | NULL    |                |
| order   | int(10)      | NO   |     | NULL    |                |
+---------+--------------+------+-----+---------+----------------+
6 rows in set (0.00 sec)

我以這種方式查詢這些表:

    SELECT * 
    FROM 
        listing_external_review_source_rel 
        RIGHT JOIN
        external_review_sources USING(ersID)
    where bid=902028 or bid IS NULL;

+-------+---------------+------+---------+--------+-------+--------+-------+
| ersID | name          | logo | lersrID | bid    | url   | active | order |
+-------+---------------+------+---------+--------+-------+--------+-------+
|     1 | G1            | a    |      17 | 902028 | url11 |      1 |     0 |
|     2 | D1            | b    |      18 | 902028 | url22 |      0 |     0 |
+-------+---------------+------+---------+--------+-------+--------+-------+
2 rows in set (0.00 sec)

正如您所看到的,結果顯示的是bid = 902028的價格,而對於Listing_external_review_source_rel中不存在的諸如866696這樣的出價,結果是空的

SELECT * 
FROM listing_external_review_source_rel 
     RIGHT JOIN external_review_sources USING(ersID) 
where bid=866696  or bid IS NULL;
Empty set (0.00 sec)

我希望結果是這樣的:

+-------+---------------+------+---------+--------+-------+--------+-------+
| ersID | name          | logo | lersrID | bid    | url   | active | order |
+-------+---------------+------+---------+--------+-------+--------+-------+
|     1 | G1            | NULL |     NULL| NULL   | NULL  |   NULL |  NULL |
|     2 | D1            | NULL |     NULL| NULL   | NULL  |   NULL |  NULL |
+-------+---------------+------+---------+--------+-------+--------+-------+
2 rows in set (0.00 sec)

這就是我使用“或出價為NULL”條件的原因。

我在做錯什么,什么查詢會給我這個結果? 我基本上也有興趣在結果中包含不匹配的行。

大多數人使用LEFT JOIN,所以我將其重寫為更標准的格式:

SELECT *
FROM external_review_sources a LEFT JOIN
     listing_external_review_source_rel b ON a.ersID=b.ersID AND bid=866696;

請記住,外部聯接將返回所有符合ON條件的行,而返回則為NULL。 在這種情況下,您的匹配條件不僅僅是ersID

嘗試這個

SELECT * FROM 
    external_review_sources e
    LEFT JOIN
    listing_external_review_source_rel r ON e.ersID = r.ersID AND r.bid = 866696
WHERE
    r.bid IS NULL;

在“外部表”上進行過濾時,該過濾器必須是派生表或在JOIN中,因為您要在WHERE之前(邏輯上)進行過濾。 另外,最佳實踐是使用LEFT JOIN來保持清晰。

帶有派生表

SELECT * FROM 
    external_review_sources e
    LEFT JOIN
    (
     SELECT * 
     FROM listing_external_review_source_rel
     WHERE bid = 866696
    ) r USING (ersID)
WHERE
    r.bid IS NULL;

嘗試這種方式,將bid列的測試移出WHERE子句並移入JOIN:

SELECT * 
    FROM listing_external_review_source_rel ler
        RIGHT JOIN external_review_sources ers   
            ON ler.ersID = ers.ersID
                AND ler.bid=866696;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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