我有一张表,其中包含唯一的用户ID和他们连接的服务器。
如何查找仅在某一天连接到服务器A和服务器B但从未连接到其他服务器(服务器C或D ......等)的用户
此查询对我不起作用:
select distinct user_id from table where server="A" and server="B"
答案 0 :(得分:2)
执行此操作的一种方法是计算用户每天连接到每台服务器的次数,然后过滤计数>服务器A和B为0,其他服务器为0。
第一个查询将导致每个用户每天一行,服务器A,B和“非A或B”的计数:
SELECT
user_id,
connect_date
COUNT(CASE WHEN server = 'A' THEN 1 END) AS ServerA,
COUNT(CASE WHEN server = 'B' THEN 1 END) AS ServerB,
COUNT(CASE WHEN server NOT IN ('A', 'B') THEN 1 END) AS ServerOther
FROM table
GROUP BY user_id, connect_date
将第一个查询推入子查询,然后过滤服务器A / B /其他值:
SELECT user_id, connect_date
FROM (
SELECT
user_id,
connect_date
COUNT(CASE WHEN server = 'A' THEN 1 END) AS ServerA,
COUNT(CASE WHEN server = 'B' THEN 1 END) AS ServerB,
COUNT(CASE WHEN server NOT IN ('A', 'B') THEN 1 END) AS ServerOther
FROM table
GROUP BY user_id, connect_date
) perUser
WHERE
ServerA > 0 AND ServerB > 0 AND ServerOther = 0
我已经包含了一个约会,因为您的问题提到“某一天内”。如果这对您不起作用,请张贴您的表格结构,并指明您的意思是“特定日期”还是“在任何一天”。
答案 1 :(得分:0)
要检查user_id
的值,其中至少有一行server
等于'A'或'B',但行存在server
等于'C'或'D',你可以这样做:
SELECT t.user_id
FROM mytable t
GROUP BY t.user_id
HAVING MAX(t.server IN ('A','B'))
AND NOT ( MAX(t.server IN ('C','D')) )
答案 2 :(得分:0)
你可以尝试这样的事情。
SELECT user_id FROM table
WHERE user_id IN(SELECT user_id FROM table WHERE server =' A')
AND server =' B'
这将(希望)获取与服务器连接的用户ID' A' &安培;服务器' B'两者。
希望这会有所帮助..!
答案 3 :(得分:0)
select user_id
from table
where server in('A','B')
group
by user_id
having count(distinct server) = 2
答案 4 :(得分:0)
mysql> select userid,server,count(*) as AB from server where server='A' OR server='B' group by userid;
如果值> 1,那么您可以在AB中尝试这个..比用户登录服务器A和B.希望这会有帮助
答案 5 :(得分:0)
由于您使用的是MySQL,因此可以使用GROUP_CONCAT
编写此查询:
SELECT DISTINCT user_id, GROUP_CONCAT(DISTINCT server ORDER BY server) AS servers
FROM table
GROUP BY user_id
HAVING servers = "A,B";
查找并连接与每个user_id相关的所有服务器,然后过滤结果,以便只返回包含所需服务器的行。