0

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

涉及两个表。

1.) phplist_user_user 2.) phplist_listuser

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

我们想要一个列出以下内容的查询:

用户的所有详细信息(来自 phplist_user_user)在 phplist_listuser 上具有 listid 126 的条目并且仅在 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 中提取完整信息。

在此先感谢并抱歉,如果这很明显,但我对其进行了一些工作和研究,但无法弄清楚。

4

2 回答 2

0

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 中完成而无需使用 subselect。

于 2014-04-09T21:59:13.607 回答
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);

编辑:另一种方法是在唯一 listid 为 126 的所有 listuser 上使用 IN 子句:

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
);
于 2014-04-09T21:08:30.820 回答