为什么这个JOIN不起作用?

时间:2011-02-11 11:01:33

标签: mysql join

数据库表

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 个答案:

答案 0 :(得分:1)

您的联接没有任何特别的错误,但它确实假设所有三个表都为每个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。