2016-07-10 5 views
2

Рассмотрим три таблицы в следующей схеме: SQL Fiddle.MySQL - Получите количество пользователей, у которых есть «пользовательский контакт»

  • Эта мини-модель представляет собой простой пример базы данных, над которой я работаю.
  • Пользователей таблицы имеет 4 атрибутов, то user_id (первичный ключ AUTO_INCREMENT), в country_id, который является внешним ключом, ссылающийся на таблицустраны, user_msisdn который является телефонным номером пользователя и имя пользователя.
  • В Контакты таблица имеет 3 атрибутов, то contact_id (первичный ключ auto_increment), в user_id, который является внешним ключом, ссылающийся на Пользователи таблицы, и contact_msisdn, который является телефоны пользовательского контакта (телефонные номера на вашем список контактов телефона).
  • Соотношения между пользователями таблицы и Контактами таблицы много-ко-многим, пользователь может иметь много контактов, и контакты можно найти в списке контактов любого пользователя.

Требования:
Для каждой страны, получить количество пользователей, которые имеют по крайней мере один «пользовательский контакт», где «пользователь-контакт» является контакт, который является пользователем, и подсчет пользователей, у которых нет «контакта с пользователем».

Например, Для страны = 'Швеция' (country_id = 3), то user_id = 3 имеет два контакта в Контакты таблицы, которые считаются "пользователь-контакт" с (MSISDN = '+220011223344' & ' +224433221100'). Таким образом, результаты запроса, которые я хочу: в Швеции есть 1 пользователь (user_id = 3), в котором есть хотя бы один «пользовательский контакт» и нулевые пользователи, у которых нет «контакта с пользователем» и т. Д. Для каждой страны.

ответ

3

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

SELECT c.country_id, 
     COUNT(DISTINCT CASE WHEN u2.user_id IS NOT NULL THEN u.user_id END) as has_contact_that_is_user , 
     COUNT(distinct CASE WHEN u2.user_id is null AND u.user_id IS NOT NULL THEN u.user_id END) as has_no_contact_that_is_user 
FROM Country c 
LEFT JOIN users u 
ON(c.country_id = u.country_id) 
LEFT JOIN contacts co 
ON(co.user_id = u.user_id) 
LEFT JOIN Users u2 
ON(u2.user_msisdn = co.contact_msisdn) 
GROUP BY c.country_id 

Fiddle

+0

Результаты запроса говорят, что "Соединенные Штаты Америки" с country_id = 1 имеет (has_contact = 1 & no_contact = 1), на самом деле, он должен привести (has_contact = 0 и no_contact = 2), так как 3 контакта пользователя_id = 1 в таблице «Контакты» не являются пользователями одновременно. Итак, истинные результаты говорят о том, что контакт пользователя также должен быть пользователем. –

+0

лучше называть подсчеты: has_contact_that_is_user & has_no_contact_that_is_user –

+0

@ Mohammad-AliItani О, вы не очень хорошо объяснили свое самочувствие .. Исправлено, попробуйте сейчас – sagi

Смежные вопросы