首页 文章

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

提问于
浏览
0

我正在执行此查询

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)))'然后事情是返回结果的多行但是如果我像'ADMIN'那样直接放置USERNAME,例如它给我结果 .

2 回答

  • 1

    你正在做 username=select... . 在相等性测试中使用的子查询只能返回一个字段/行 . 因为你're going an unfiltered 203282 , you'每次返回一个字段的许多行 . 为此你需要 IN 匹配:

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

    SQL不允许本质上是什么

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

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

  • 3

    这是你的 where 条款:

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

    这至少有三个问题 .

    • UPPER() 的子查询参数可能会返回多个值,并且可能会返回,除非 USERS 表有0行或1行 .

    • =UPPER() 也有类似的问题 . in 更合适 .

    • 在外部 where 子句中使用 = 也有类似的问题 . in 更合适 .

    以下修复了这些问题:

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

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

相关问题