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 свою колонку заводить?
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
29 мар. 2024, в 11:11
10000 руб./за проект
29 мар. 2024, в 10:00
10000 руб./за проект
29 мар. 2024, в 09:59
750 руб./в час