Выборка пересекающихся контактов

Sync

Новичок
Выборка пересекающихся контактов

Есть таблица пользователей. Каждый пользователь может иметь несколько е-мейлов и несколько телефонов.

Соответственно есть две таблицы:

users_emails
id email

и users_phones:
id phone

Нужно выбрать всех пользователей у которых совпадают либо e-мейл либо телефон.
Идеальный вид результата такой:
PHP:
id_1   id_2   what

  1     2      phone 
  1     2      email
  1     3      email
  3     5      phone
Пробовал писать такой запрос, но появляются лишние строки, требующие дополнительной программной обработки

PHP:
SELECT 
     utp1.id AS id_phone_1, 
     utp2.id AS id_phone_2, 
     ute1.id AS id_email_1, 
     ute2.id AS id_email_2, 
FROM `users_phones` utp1 
     INNER JOIN  `users_phones` utp2 ON utp1.phone = utp2.phone AND utp1.id <> utp2.id
     INNER JOIN  `users_emails`   ute1, `users_emails` ute2 ON ute1.email = ute2.email AND ute1.id <> ute2.id
 

Андрейка

Senior pomidor developer
т.к. у тя мылы и телефоны в разных таблицах - сделай их (пока) раздельно 2 запросами..
неравенство перенести в where и посмотреть что получится
 

alpine

Новичок
Sync
А ты мне можешь объяснить зачем ты мылы и телефоны сделал в отдельных таблицах?

-~{}~ 22.11.06 16:14:

Тем более если они у тебя там повторяются, судя по запросу выше ...
 

Sync

Новичок
Автор оригинала: alpine
А ты мне можешь объяснить зачем ты мылы и телефоны сделал в отдельных таблицах?
Ты предлагаешь добавить что-то типа флага is_email (is_phone) и сохранять все в одну?
Ну не знаю... учитывая что пользовтелей может быть тысяч 5, при сравнении может дать некоторый прирост в скорости, то есть если по 2-3 телефона и мыла у каждого.
 

alpine

Новичок
Sync
Ты предлагаешь добавить что-то типа флага is_email (is_phone) и сохранять все в одну?
Я пока ничего не предлагаю.
Что каcается запроса:
[sql]
(SELECT GROUP_CONCAT(id) as users_ids, phone as item, 'phone' as what FROM user_phones GROUP BY phone HAVING COUNT(*) > 1)
UNION ALL
(SELECT GROUP_CONCAT(id) as users_ids, email, 'email' FROM user_emails GROUP BY email HAVING COUNT(*) > 1)
[/sql]
 
Сверху