Внешнее соединение MYSQL, не возвращает несоответствующие строки - PullRequest
0 голосов
/ 19 декабря 2011

У меня есть эти две таблицы в моей базе данных

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)

Как вы можете видеть, результаты отображаются для ставки = 902028, однако для ставки, такой как 866696, которая НЕ существует в перечислении_external_review_source_rel, результаты пусты

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)

Это то, что я использовал условие "или ставка IS NULL".

Что я делаю не так и какой запрос даст мне этот результат? Я в основном заинтересован в том, чтобы в моих результатах также были несопоставимые строки.

Ответы [ 3 ]

4 голосов
/ 19 декабря 2011

Большинство людей используют 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

1 голос
/ 19 декабря 2011

Попробуйте это

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;

При фильтрации по «внешним таблицам» фильтр должен быть производной таблицей или соединением, потому что вы хотите фильтровать до 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;
0 голосов
/ 19 декабря 2011

Попробуйте сделать так, переместив тест столбца 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;
...