选择仅存在于一个特定列表中的用户(phplist)

时间:2014-04-09 20:50:35

标签: mysql sql phplist

我需要一个MYSQL查询来识别phplist上仅列在一个列表上的所有订阅者(列表ID为126)。

涉及两个表格。

1。)phplist_user_user 2.)phplist_listuser

phplist_listuser有两个名为'userid'和'listid'的字段值得关注。 phplist_user_user也有一个'userid',它是该表中用户字段的关键。

我们想要一个列出的查询:

用户的所有细节(来自phplist_user_user) 在listid 126的phplist_listuser上有一个条目 AND只在listid 126上,所以他们应该只在phplist_listuser中有listid 126的条目,如果他们有任何其他列表,则不应该包含它们。

所以要重新说出我们想要的上述内容: 在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的用户详细信息具有ID 2,3,4而不是其他用户,因为它们不在126或126上,而且在其他列表上。

有人可以帮我吗?

SELECT * FROM phplist_listuser
WHERE listid <=> 126;

上面的工作是获取列表126上的每个用户ID,但我现在需要能够检查用户是否在任何其他列表中,然后从phplist_user_user中提取完整信息。

先谢谢,如果这很明显,我很抱歉,但是我已经做了一些工作和研究,无法弄明白。

2 个答案:

答案 0 :(得分:0)

一种方法是使用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);

编辑:另一种方法是在所有listusers上使用IN子句,其中唯一的listid为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
);

答案 1 :(得分:0)

MySQL有一个feature,允许您在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中完成而不使用subselect。