簡體   English   中英

MySQL子查詢返回多行與子查詢選擇計數

[英]MySQL subquery returns more than one row selecting count with subquery

我正在執行此查詢

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;

我試圖從數據庫表用戶中的每個用戶獲取此查詢,並進行子查詢以選擇所有人'UPPER((SELECT USERNAME FROM USERS)))',結果是返回的結果超過一行例如,直接輸入USERNAME之類的“ ADMIN”即可得到結果。

您正在執行username=select... 相等性測試中使用的子查詢只能返回一個字段/行。 由於要進行未經過濾的“將用戶表中的所有內容都給定”,因此您將返回許多一個字段的許多行。 為此,您需要一個IN匹配項:

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

SQL不允許本質上是什么

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

這就是IN運算符用於比較值集的原因。

這是您的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的了解似乎有限。 我建議您再問一個問題,提供樣本數據,所需的結果並解釋您想做什么。 這將使該站點上有知識的人更容易為您指出正確的方向來編寫查詢。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM