MySQL:子查询返回超过1行

MySQL:子查询返回超过1行,mysql,sql,select,subquery,Mysql,Sql,Select,Subquery,我知道这已经被问了很多次了,但是我找不到一个和我的答案相近的答案 我有以下疑问: SELECT c.cases_ID, c.cases_status, c.cases_title, ci.custinfo_FName, ci.custinfo_LName, c.cases_timestamp, o.organisation_name FROM db_cases c, db_custinfo ci, db_organisation o WHERE c.userInfo_ID = ci.user

我知道这已经被问了很多次了,但是我找不到一个和我的答案相近的答案

我有以下疑问:

SELECT c.cases_ID, c.cases_status, c.cases_title, ci.custinfo_FName, ci.custinfo_LName, c.cases_timestamp, o.organisation_name 
FROM db_cases c, db_custinfo ci, db_organisation o 
WHERE c.userInfo_ID = ci.userinfo_ID AND c.cases_status = '2' 
AND organisation_name = (
    SELECT organisation_name 
    FROM db_sites s, db_cases c 
    WHERE organisation_ID = '111'
)
AND s.sites_site_ID = c.sites_site_ID)
我想做的是获取案例,在案例中定义的站点ID也出现在db_sites sites表中,与我想过滤的组织ID一起出现在db_sites sites表中,正如“organization_ID='111'”所定义的那样,但我得到了问题中所述的MySQL的响应

我希望这是有意义的,我将感谢任何帮助这一点


谢谢。

因为错误说明您的子查询返回的行多于一行,在这种情况下无法执行。如果这不是预期的结果,你真的应该调查为什么会发生这种情况。但是如果您知道会发生这种情况,并且只需要第一个结果,请使用
LIMIT 1
将结果限制为一行

SELECT organisation_name 
FROM db_sites s, db_cases c 
WHERE organisation_ID = '111'
LIMIT 1

问题是,很明显,您的子查询返回多个行,当将其用作标量子查询(如WHERE子句中的=运算符)时,这些行无效

相反,您可以对子查询执行内部联接,该联接将只筛选与on子句匹配的行。这将获得所有匹配的行,即使子查询中返回了多行

更新: 您可能会从子查询中获得多行,因为您正在对db_sites和db_cases表进行交叉连接。在WHERE子句中,您使用的是旧式的联接语法,但没有限定任何谓词来联接表。出于这个原因,不建议使用这种连接表的旧样式。如果您明确说明它是什么类型的联接,以及应该如何联接表,那就更好了

关于连接的好页面: (对于正确的语法)
(关于连接类型之间的差异)

我花了一个小时来讨论这个问题,并将其完全复杂化。有时,快速休息并在在线论坛上写下来可以帮你解决问题;)

这是应该的查询

SELECT c.cases_ID, c.cases_status, c.cases_title, ci.custinfo_FName, ci.custinfo_LName, c.cases_timestamp, c.sites_site_ID 
FROM db_cases c, db_custinfo ci, db_sites s 
WHERE c.userInfo_ID = ci.userinfo_ID AND c.cases_status = '2' AND (s.organisation_ID = '111' AND s.sites_site_ID = c.sites_site_ID)
Let me re-write what you have post:

SELECT 
    c.cases_ID, c.cases_status, c.cases_title, ci.custinfo_FName, ci.custinfo_LName, 
    c.cases_timestamp, c.sites_site_ID 
FROM
    db_cases c
JOIN   
    db_custinfo ci ON c.userInfo_ID = ci.userinfo_ID and c.cases_status = '2'
JOIN   
    db_sites s ON s.sites_site_ID = c.sites_site_ID and s.organization_ID = 111