MySQL Left join WHERE table2.field = "X" - PullRequest
19 голосов
/ 02 апреля 2012

У меня есть следующие таблицы:

страницы :

+------------+--------------+------+-----+---------+----------------+
| 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    |                |
+------------+--------------+------+-----+---------+----------------+

custom :

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

Iхотите объединить таблицы таким образом, чтобы:
1) были возвращены все записи из первой таблицы LEFT JOIN custom ON pages.page_id = custom.page_id
2) pages.type IN ('type_a', 'type_b', 'type_c')
3) «ключ» из второй таблицы имеет значение »голоса "custom.key = 'votes'

Я все сделал до сих пор, но третье условие - проблема.Если в таблице custom нет записи для key = 'votes', запрос возвращает только эти записи с записями.Я хочу вернуть NULL, если пропущены записи.

Мне нужно key = 'votes', потому что у меня есть другие записи для этого page_id, где ключ не «голос», и это дублирует строки из страниц

Ответы [ 3 ]

27 голосов
/ 02 апреля 2012

Просто добавьте свой контрапункт 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') ;
6 голосов
/ 02 апреля 2012

Я бы сделал это так:

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');
2 голосов
/ 02 апреля 2012

попробуйте изменить ваше условие where на custom.key = 'voice' ИЛИ ​​custom.key is null.

...