需要有关mysql查询的帮助才能使其正常工作

时间:2015-06-06 20:54:03

标签: mysql subquery

我有一张表,其中包含唯一的用户ID和他们连接的服务器。

如何查找仅在某一天连接到服务器A和服务器B但从未连接到其他服务器(服务器C或D ......等)的用户

此查询对我不起作用:

select distinct user_id from table where server="A" and server="B" 

6 个答案:

答案 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相关的所有服务器,然后过滤结果,以便只返回包含所需服务器的行。