MySql, нужен запрос для извлечения нескольких полей из таблиц в одну строку - PullRequest
1 голос
/ 30 ноября 2011

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

**EmpInfo**

ID               Name                Address
--------------------------------------------------------
10001            Rocky Silva         11, satellite street


**EmpContact**  notion ( M for mobile number and L for Landline number)

ID               Phone               Type
--------------------------------------------------------
10001          909099925               M
10001          20222525                L   

Я хочу создать представление таким образом, чтобы оно возвращало меня, следуя в одной строке (не в двух строках после декартового произведения):

10001        Rocky Silva       11, satellite street  909099925      20222525

Может ли кто-нибудь помочь мне с вопросом?Я пробовал разные соединения, но безуспешно;Я думаю, что что-то упустил ...

Ответы [ 5 ]

4 голосов
/ 30 ноября 2011
SELECT id, name address, GROUP_CONCAT(phone) as phones
FROM EmpInfo
JOIN EmpContact USING (id)
GROUP BY id;
2 голосов
/ 30 ноября 2011

Попробуйте:

select i.ID,
       i.Name,
       i.Address,
       cm.Phone as Mobile,
       cl.Phone as Landline
from EmpInfo i
left join EmpContact cm on i.ID = cm.ID and cm.Type = 'M'
left join EmpContact cl on i.ID = cl.ID and cl.Type = 'L'
1 голос
/ 30 ноября 2011

Используйте для этого функцию group_concat

SELECT i.id, i.name, i.address, group_concat(c.phone)
from empInfo i, empContact c
where c.id = i.id
group by i.id,i.name,i.address

, и все телефоны будут разделены запятой в одном столбцеЕсли вы хотите отдельные столбцы, сделайте это

SELECT i.id, i.name, i.address,
GROUP_CONCAT(if (Type = 'M', phone, NULL)) AS 'Mobile', 
GROUP_CONCAT(if (Type = 'L', phone, NULL)) AS 'Landline', 
from empInfo i, empContact c
where c.id = i.id
group by i.id,i.name,i.address
1 голос
/ 30 ноября 2011

Попробуйте это -

SELECT e.*, MAX(IF(ec.Type = 'M', ec.Phone, NULL)) M, MAX(IF(ec.Type = 'L', ec.Phone, NULL)) L FROM EmpInfo e
  LEFT JOIN EmpContact ec
    ON e.ID = ec.ID
GROUP BY e.ID;
0 голосов
/ 30 ноября 2011

Если вы знаете количество элементов, которые нужно объединить, вы можете сделать что-то вроде следующего (для 2):

SELECT EmpInfo.*, EC1.Phone, EC2.Phone from EmpInfo, EmpContact as EC1, EmpContact is EC2
WHERE EmpInfo.ID = EC1.ID and EmpInfo.ID = EC2.ID and EC1.Phone < EC2.Phone

Это предполагает, что для каждого идентификатора

есть ровно 2 телефона
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...