MySQL子查询返回多个行,用子查询选择count

时间:2014-06-12 15:04:08

标签: mysql sql

我正在执行此查询

SELECT COUNT(*) AS CONNECTIONS, SERVERS.NAME AS SERVER_NAME, USERS.USERNAME AS USER, CONECT_DATE AS CONNECTION_DATE
FROM CONECTIONS JOIN SERVERS ON(CONECTIONS.SERVERID = SERVERS.ID)
JOIN USERS ON (CONECTIONS.USERID = USERS.ID)
WHERE CONECTIONS.USERID = (SELECT ID FROM USERS 
WHERE UPPER(USERNAME) =                                 UPPER((SELECT USERNAME FROM USERS)))
AND CONECT_DATE BETWEEN '2010-06-11' AND '2019-06-11' 
GROUP BY SERVERID, CONECT_DATE;

我试图从db TABLE USERS中的每个用户那里获取此查询,并使用子查询来选择每个人的UPPER((SELECT USERNAME FROM USERS)))',那就是返回结果的多行但是,如果我直接将USERNAME设置为'ADMIN',例如它会给我结果。

2 个答案:

答案 0 :(得分:3)

你在做username=select...。在相等测试中使用的子查询只能返回一个字段/行。既然你正在未经过滤的“gimme用户表中的所有内容”,那么你将返回每个字段的多个行。为此,您需要IN匹配:

SELECT ... 
WHERE ... UPPER(username) IN (SELECT USERNAME FROM users)
                         ^^^^---this

SQL不允许基本上

WHERE foo=1,2,3,4,5,6

这就是IN运算符工作的原因,用于比较值集。

答案 1 :(得分:1)

这是您的where条款:

WHERE CONECTIONS.USERID = (SELECT ID
                           FROM USERS 
                           WHERE UPPER(USERNAME) = UPPER((SELECT USERNAME FROM USERS))
                          )

这至少有三个问题。

  1. UPPER()的子查询参数可能返回多个值,并且可能会返回,除非USERS表有0行或1行。
  2. =UPPER()有类似的问题。 in更合适。
  3. =子句中使用where也有类似的问题。 in更合适。
  4. 以下修复了这些问题:

    WHERE CONECTIONS.USERID IN (SELECT ID
                                FROM USERS 
                                WHERE UPPER(USERNAME) IN (SELECT UPPER(USERNAME) FROM USERS))
                               )
    

    但是,我怀疑这将修复您的整体查询。您对SQL的了解似乎有点受限。我建议你问另一个问题,提供样本数据,想要的结果,并解释你想做什么。这将使本网站上知识渊博的人更容易指出您正确的方向来撰写您的查询。