【问题标题】:MySQL subquery returns more than one row selecting count with subqueryMySQL 子查询返回多于一个行选择计数与子查询
【发布时间】:2014-08-02 23:28:01
【问题描述】:

我正在执行这个查询

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”,它会给我结果。

【问题讨论】:

  • 您确定您使用的是区分大小写的排序规则吗?而且(除了所有的拼写错误)这个查询的后半部分是胡言乱语。考虑与所需的结果集一起提供适当的 DDL(和/或 sqlfiddle)。

标签: mysql sql


【解决方案1】:

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

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

SQL 不允许本质上是什么

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

这就是为什么IN 运算符起作用的原因,用于比较值集。

【讨论】:

  • 好吧,你可以坚持另一个加入
【解决方案2】:

这是您的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 更合适。

以下解决了这些问题:

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

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

【讨论】:

  • 谢谢你!它工作得很好,我想显示每个用户在 date1 和 date2 之间的特定日期对服务器所做的连接(计算连接数)。
猜你喜欢
  • 1970-01-01
  • 2014-02-15
  • 2017-05-29
  • 1970-01-01
  • 2018-03-08
  • 1970-01-01
  • 2014-01-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多