Alexeytur
@Alexeytur

Вопрос по джоинам?

Добрый день.

Есть таблица, содержащая контактную информацию пользователей:
============================================================
User_id | InfoType | Email | Phone |
---------------------------------------------------------------
1 | 'Email' | 'q@c.com' | NULL |
1 | 'Phone' | NULL | '1234567'|
============================================================

Нужно по фильтру № телефона вытащить всю контактную информацию по юзеру с таким номером телефона.
select * from users JOIN contact_info ON users.user_id=contact_info.user_id 
WHERE Phone  = '1234567'
в таком запросе строки с емейлом не попадут в результат.

Как можно это решить? И можно ли обойтись джойнами, без подзапросов?
  • Вопрос задан
  • 116 просмотров
Решения вопроса 1
tsklab
@tsklab
Здесь отвечаю на вопросы.
Но в таблице users нет поля Phone, оно в таблице contact_info

SELECT * FROM contact_info 
  INNER JOIN contact_info AS UserPhone ON contact_info.user_id = UserPhone.user_id
  WHERE UserPhone.Phone  = '1234567'


А если нужен и users
SELECT users.*, contact_info.* FROM contact_info 
  INNER JOIN contact_info AS UserPhone ON contact_info.user_id = UserPhone.user_id
  INNER JOIN users ON users.user_id = UserPhone.user_id
  WHERE UserPhone.Phone  = '1234567'


Если сделаете структуру:
===========================
User_id | InfoType | Value |
---------------------------
1 | 'Email' | 'q@c.com' |
1 | 'Phone' | '1234567' |
===========================

SELECT users.*, contact_info.* FROM contact_info 
  INNER JOIN contact_info AS UserPhone ON contact_info.user_id = UserPhone.user_id
  INNER JOIN users ON users.user_id = UserPhone.user_id
  WHERE UserPhone.InfoType = 'Phone' AND UserPhone.Phone  = '1234567'
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
LaRN
@LaRN
Senior Developer
Можно вот так попробовать:

select pn.user_id, 
       MAX(pn.Phone), 
       MAX(ml.Email)
  from contact_info pn   
  JOIN users
    ON users.user_id = pn.user_id 
  LEFT
  JOIN contact_info ml
    ON ml.user_id    = pn.user_id 
   AND ml.InfoType      = 'Phone'   
 WHERE pn.user_id.Phone = '1234567'
   AND pn.InfoType      = 'Email'
 GROUP BY pn.user_id


Но структура хранения странная.
У Вас же есть поле InfoType, зачем еще для каждого вида InfoType свою колонку заводить?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы