子查询返回超过1行

use*_*199 10 mysql mysql-5.5

select 
    disease_name 
from 
    disease 
where 
    disease_id=
    (select disease_id from disease_symptom where
        disease.disease_id=disease_symptom.disease_id AND 
        symptom_id=
               (select symptom_id from symptom where symptom.symptom_id=disease_symptom.symptom_id
                AND symptom_name='fever' OR symptom_name='head ache'))
Run Code Online (Sandbox Code Playgroud)

给出子查询返回多行的错误.原因是什么?

bio*_*net 17

您的两个外部查询的结构是期望来自其子查询的单个结果.但是,如果你有结构化的方式,你的子查询可能会返回多个结果.如果您确实需要多个结果,请按以下方式重组:

... where disease_id IN (subquery returning multiple rows...)
Run Code Online (Sandbox Code Playgroud)

此外,子查询是kill性能,并且它对嵌套子查询呈指数级支持.您可能希望改为使用INNER JOIN.


小智 2

分解你的查询,你有

主要查询:

select disease_name from disease where disease_id=
Run Code Online (Sandbox Code Playgroud)

子查询1:

select disease_id from disease_symptom where
        disease.disease_id=disease_symptom.disease_id AND 
        symptom_id=
Run Code Online (Sandbox Code Playgroud)

子查询2:

select symptom_id from symptom where symptom.symptom_id=disease_symptom.symptom_id
            AND symptom_name='fever' OR symptom_name='head ache'
Run Code Online (Sandbox Code Playgroud)

由于您使用等号,子查询无法返回多个项目。由于正在使用,看起来子查询 2 有更大的机会返回 2 个项目OR。您可能希望尝试使用诸如withIN之类的子句WHERE symptom_id IN (sub-query2)WHERE disease_id IN (sub-query1)