Запутанный запрос MySQL - PullRequest
       19

Запутанный запрос MySQL

1 голос
/ 26 апреля 2009

У меня есть две таблицы, staff и phones.

Staff имеет только одно поле, staff_id. Phones имеет три поля: staff_id, phone_type и number.

Я хочу отобразить staff_id, номер мобильного телефона и номер домашнего телефона всех сотрудников. Но я не могу понять, как получить номер мобильного телефона и номер домашнего телефона в виде отдельных столбцов в результате. Вот то, что я пробовал до сих пор: оба типа чисел помещаются в один столбец.

SELECT staff.staff_id, phones.number
FROM staff
LEFT JOIN phones ON ( staff.staff_id = phones.staff_id && ( phones.field_type = 'Cell' || phones.field_type = 'Home' ) )

Ответы [ 4 ]

2 голосов
/ 26 апреля 2009

Вам нужно использовать сводный запрос, что-то вроде непроверенного кода ниже:

select staff.staff_id,
       MAX(IF(phones.field_type='Cell', phones.number, null)) as Cell,
       MAX(IF(phones.field_type='Home', phones.number, null)) as Home
from   staff,
       phones
where  phones.staff_id = staff.staff_id
group by staff.staff_id

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

См. Также http://dev.mysql.com/doc/refman/5.1/en/select.html (поиск по "pivot").

1 голос
/ 26 апреля 2009

Вам нужно присоединиться к таблице телефонов дважды.

SELECT staff.staff_id, cellPhones.number, homePhones.number,
FROM staff
LEFT JOIN phones cellPhones ON ( staff.staff_id = phones.staff_id && phones.field_type = 'Cell' )
LEFT JOIN phones homePhones ON ( staff.staff_id = phones.staff_id && phones.field_type = 'Home' )
1 голос
/ 26 апреля 2009

Это похоже на проблему с моей адресной книгой.

Вы можете найти ответ здесь: Проблемы базы данных SQL с дизайном таблицы адресной книги

1 голос
/ 26 апреля 2009

Вы не можете сделать это таким образом, так как вы не можете присвоить значения столбцам.
Вы должны сделать 2 соединения:

SELECT staff.staff_id, cells.number, home.number FROM staff 
  JOIN phones AS cells ON (...)
  JOIN phones AS home ON (...)
  WHERE cells.field_type='Cell' AND home.field_type='Home';

Это сработало бы, но у вас не будет дома и номера мобильного телефона сотрудников в одной колонке.

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