Почему этот JOIN не работает? - PullRequest
       4

Почему этот JOIN не работает?

0 голосов
/ 11 февраля 2011

Таблицы базы данных

ss_merchant

+----------------+--------------+------+-----+---------+----------------+
| Field          | Type         | Null | Key | Default | Extra          |
+----------------+--------------+------+-----+---------+----------------+
| pk_merchant_id | bigint(20)   | NO   | PRI | NULL    | auto_increment |
| name           | varchar(45)  | YES  |     | NULL    |                |
| website        | varchar(100) | YES  |     | NULL    |                |
+----------------+--------------+------+-----+---------+----------------+

ss_merchant_store

+----------------------+-------------+------+-----+---------+----------------+
| Field                | Type        | Null | Key | Default | Extra          |
+----------------------+-------------+------+-----+---------+----------------+
| pk_merchant_store_id | bigint(20)  | NO   | PRI | NULL    | auto_increment |
| fk_pk_merchant_id    | bigint(20)  | YES  |     | NULL    |                |
| street               | varchar(20) | YES  |     | NULL    |                |
| city                 | varchar(20) | YES  |     | NULL    |                |
| postcode             | varchar(8)  | YES  |     | NULL    |                |
| telephone            | varchar(15) | YES  |     | NULL    |                |
| email                | varchar(45) | YES  |     | NULL    |                |
+----------------------+-------------+------+-----+---------+----------------+

ss_merchant_store_rating

+-----------------------------+------------+------+-----+---------+----------------+
| Field                       | Type       | Null | Key | Default | Extra          |
+-----------------------------+------------+------+-----+---------+----------------+
| pk_merchant_store_rating_id | bigint(20) | NO   | PRI | NULL    | auto_increment |
| fk_pk_merchant_store_id     | bigint(20) | NO   |     | NULL    |                |
| rating                      | int(1)     | YES  |     | NULL    |                |
+-----------------------------+------------+------+-----+---------+----------------+

и мой запрос:

SELECT *  
FROM ss_merchant 
JOIN ss_merchant_stores 
ON ss_merchant.pk_merchant_id = ss_merchant_stores.fk_pk_merchant_id 
JOIN ss_merchant_store_rating 
ON ss_merchant_stores.pk_merchant_store_id = ss_merchant_store_rating.fk_pk_merchant_store_id

1 Ответ

1 голос
/ 18 марта 2011

В вашем соединении нет ничего плохого, но предполагается, что во всех трех таблицах есть хотя бы одна строка для каждого merchant_id. Если вы хотите разрешить несуществующие строки merchant_store_rating, используйте LEFT JOIN

Если нет подходящей строки для правая таблица в ON или USING части в LEFT JOIN, строка со всеми столбцами значение NULL используется для права Таблица. Вы можете использовать этот факт, чтобы найти строки в таблице, которые не имеют аналог в другой таблице:

SELECT left_tbl.*   FROM left_tbl LEFT JOIN right_tbl 
ON left_tbl.id = right_tbl.id   WHERE right_tbl.id IS NULL; 

Этот пример находит все строки в left_tbl со значением id, которое не присутствует в right_tbl (то есть все строки в left_tbl без соответствующих строка в right_tbl). Это предполагает, что right_tbl.id объявлено как NOT NULL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...