次の表があります。
ページ:
_+------------+--------------+------+-----+---------+----------------+
| 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'
_が必要です。
制約を追加するだけ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') ;
私はこのようにします:
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');
where条件をcustom.key = 'votes' OR custom.key is nullに変更してみてください。