Выберите пользователей, которые существуют только в одном конкретном списке (phplist)

Мне нужен запрос MYSQL для идентификации всех подписчиков в phplist, которые находятся только в одном списке (с идентификатором списка 126).

Задействованы две таблицы.

1.) phplist_user_user 2.) phplist_listuser

В phplist_listuser есть два поля с именами «userid» и «listid», которые вызывают беспокойство. phplist_user_user также имеет «userid», который является ключом к пользовательским полям в этой таблице.

Нам нужен запрос, который будет содержать список:

все сведения о пользователях (из phplist_user_user), которые имеют запись в phplist_listuser для listid 126 И находятся только в listid 126, поэтому они должны иметь записи только для listid 126 в phplist_listuser, если у них есть какой-либо другой список, их не следует включать.

Итак, чтобы перефразировать вышеизложенное, мы хотим: Детали пользователей, которые находятся в listid 126, но не в каком-либо другом списке.

вот пример таблиц

phplist_listuser
userid listid

1      126

1      32

1      51 

2      126

3      126

4      126

5      126

5      127

6      128

В этом запросе мне нужны только данные пользователя из phplist_user_user, которые имеют идентификаторы 2, 3, 4, а не другие, потому что они либо не в 126, либо в 126, а также в других списках.

Может ли кто-нибудь помочь мне здесь?

SELECT * FROM phplist_listuser
WHERE listid <=> 126;

Вышеупомянутое работает, чтобы получить каждый идентификатор пользователя, который находится в списке 126, но теперь мне нужно проверить, что пользователь не находится в каких-либо других списках, а затем получить полную информацию из phplist_user_user.

Заранее спасибо и извините, если это очевидно, но я приложил некоторые усилия и исследования и не могу понять это.


person SCHNiKEN    schedule 09.04.2014    source источник


Ответы (2)


Один из способов - использовать EXISTS и NOT EXISTS:

select * 
from phplist_user_user uu
where exists (select * from phplist_listuser lu where lu.listid = 126 and lu.userid = uu.userid)
and not exists (select * from phplist_listuser lu where lu.listid <> 126 and lu.userid = uu.userid);

РЕДАКТИРОВАТЬ: Другой способ - использовать предложение IN для всех пользователей списка, где единственным идентификатором списка является 126:

select * 
from phplist_user_user
where userid in
(
  select lu.userid 
  from phplist_listuser lu
  group by lu.userid
  having min(lu.listid) = 126 and max(lu.listid) = 126
);
person Thorsten Kettner    schedule 09.04.2014

MySQL имеет функцию, которая позволяет вам использовать неагрегированные столбцы в SELECT:

SELECT u.*,lu.listid FROM phplist_user_user u
JOIN phplist_listuser lu USING (userid)
GROUP BY u.userid
HAVING COUNT(DISTINCT lu.listid)=1 AND lu.listid=126;

Это просто для того, чтобы показать, что это можно сделать в MySQL без использования подвыборки.

person vhu    schedule 09.04.2014