web-dev-qa-db-ja.com

MySQL左結合WHERE table2.field = "X"

次の表があります。

ページ

_+------------+--------------+------+-----+---------+----------------+
| Field      | Type         | Null | Key | Default | Extra          |
+------------+--------------+------+-----+---------+----------------+
| page_id    | int(11)      | NO   | PRI | NULL    | auto_increment |
| type       | varchar(20)  | NO   |     | NULL    |                |
| categories | varchar(255) | NO   |     | NULL    |                |
| title      | varchar(255) | NO   | MUL | NULL    |                |
| text       | longtext     | NO   | MUL | NULL    |                |
+------------+--------------+------+-----+---------+----------------+
_

カスタム

_+---------+------------------+------+-----+---------+-------+
| Field   | Type             | Null | Key | Default | Extra |
+---------+------------------+------+-----+---------+-------+
| page_id | int(10) unsigned | NO   | PRI | NULL    |       |
| key     | varchar(255)     | NO   | PRI | NULL    |       |
| value   | longtext         | NO   |     | NULL    |       |
+---------+------------------+------+-----+---------+-------+
_

次のような方法でテーブルを結合します。
1)最初のテーブルのすべてのエントリが返されます_LEFT JOIN custom ON pages.page_id = custom.page_id_
2)pages.type IN ('type_a', 'type_b', 'type_c')
3)2番目のテーブルの "key"の値は "votes" _custom.key = 'votes'_です

ここまではすべて作りましたが、3つ目が問題です。テーブルに_key = 'votes'_のエントリがない場合customクエリはこれらのエントリのみを返します。エントリがない場合はNULLを返します。

キーが「投票」ではないこのpage_idの他のエントリがあり、これによりpagesの行が重複するため、_key = 'votes'_が必要です。

21
Ivan Dokov

制約を追加するだけcustom.key='votes'からLEFT JOIN

SELECT * 
FROM pages LEFT JOIN custom 
     ON pages.page_id=custom.page_id AND custom.key='votes' 
WHERE pages.type IN('type_a','type_b','type_c') ;
30
dgw

私はこのようにします:

SELECT * 
FROM pages 
LEFT JOIN
   ( SELECT * From custom where key='votes') cv
   on pages.page_id = cv.page_id
WHERE pages.type IN ('type_a', 'type_b', 'type_c');
6
GregHNZ

where条件をcustom.key = 'votes' OR custom.key is nullに変更してみてください。

2