我需要一个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中提取完整信息。
先谢谢,如果这很明显,我很抱歉,但是我已经做了一些工作和研究,无法弄明白。
答案 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。