Какой тип соединения MySQL мне нужен? - PullRequest
2 голосов
/ 15 марта 2012

Простые таблицы MySQL с соответствующими значениями идентификаторов в разных таблицах:

table 1;
pid, firstname

table 2;
id, pid, property, value

Допустим, в таблице 1 есть одна запись о человеке:

pid: 1
firstname: fred

Для каждого человека есть несколько записей в таблице 2:

pid: 1
property: likes cats?
value: no

pid: 1
property: eye colour
value: orange

pid: 1
property: favourite food
value: sox

Я хочу выбрать только две из множества записей таблицы два, скажем, цвет глаз и добавить записи о еде для данного идентификатора человека. Какое внешнее соединение может достичь этого?

SELECT `t1`.name
FROM `table1` AS t1
LEFT JOIN `table2` t2 ON `t1`.pid = `t2`.pid
WHERE `t1`.pid = 1
AND `t2`.property =  'eye colour'

Я застрял здесь, как получить две строки из таблицы 2 и включить также фавориты? (Пока никто не сказал, нет, я не могу изменить структуру этой базы данных).

Спасибо за чтение.

Ответы [ 4 ]

5 голосов
/ 15 марта 2012

Вам нужно присоединиться дважды:

SELECT 
  t1.name
  ,t2a.value as eye_color
  ,t2b.value as fav_food
FROM table1 t1
LEFT JOIN table2 t2a ON (t1.pid = t2a.pid AND t2a.property = 'eye colour')
LEFT JOIN table2 t2b ON (t1.pid = t2b.pid AND t2b.property = 'fav food')
WHERE t1.pid = 1
4 голосов
/ 15 марта 2012

Как насчет чего-то вроде:

 SELECT t1.name, t2.property, t2.value
 FROM table2 t2
 INNER JOIN table1 t1 ON t1.pid = t2.pid
 WHERE t2.pid = 1
 AND t2.property IN ('eye colour','favourite food')

Или вы просто хотели первые два, однако MySQL проиндексировал его:

 SELECT t1.name, t2.property, t2.value
 FROM table2 t2
 INNER JOIN table1 t1 ON t1.pid = t2.pid
 WHERE t2.pid = 1
 LIMIT 2

Нет реальной причины использовать здесь левое соединение, так каквсегда должен быть связанный pid, определенный в table1.

2 голосов
/ 15 марта 2012

Как насчет этого?

SELECT t.name, t.value, t3.value
FROM
(SELECT t1.name, t2.value, t1.pid
FROM table1 t1
LEFT JOIN table2 t2 ON t1.pid = t2.pid
WHERE t1.pid = 1
AND t2.property =  'eye colour') t
LEFT JOIN table2 t3 ON t.pid = t3.pid
WHERE t.pid = 1
AND t3.property =  'favourite food'

Это также будет работать для людей, у которых нет записи «цвет глаз» или «любимая еда»

0 голосов
/ 15 марта 2012

Если вы хотите сделать это с одним запросом, то вы должны использовать INNER JOIN, но я не рекомендую это.Если бы я был тобой, я бы сначала выбрал человека, а затем создал бы другой запрос, чтобы получить необходимые записи в таблице2.Попробуйте оба моих решения, которые вы могли бы выбрать для себя.

...