SQL多个结果在子查询中

时间:2017-06-09 15:05:20

标签: mysql sql

我有两个表格,如:

 1. reports:                   2. schedule:
     | id   | data        |        | rpt  | username |
     -------|-------------|        |------|----------|
     | 1110 | aaaaaaaaa   |        | 1110 | name3    |
     | 1120 | bbbbbbbbb   |        | 1110 | name3    |
     | 1130 | ccccccccc   |        | 1110 | name1    |
     | 1140 | ddddddddd   |        | 1130 | name1    |
     | 1150 | eeeeeeeee   |        | 1140 | name1    |
     | 1160 | fffffffff   |        | 1140 | name2    |
                                   | 1150 | name2    |
                                   | 1160 | name3    |

在搜索用户名时,我想查看此名称出现的所有报告ID的计划表(每个报告可能出现多次,我只需要一次),然后获取结果表报告ID和数据。

因此对name3我应该得到:1110 aaaaaaaaa | 1160 fffffffff

name11110 aaaaaaaaa | 1130 ccccccccc | 1140 ddddddddd

我尝试使用此代码行执行此操作:

SELECT * FROM reports WHERE id=(SELECT DISTINCT rpt FROM schedule WHERE username='name3')

问题是,在name3的情况下,我收到此错误消息:

[MySQL][ODBC 3.51 Driver][mysqld-5.6.33]Subquery returns more than 1 row

解决问题的正确方法是什么?

4 个答案:

答案 0 :(得分:0)

我认为你的查询应该是:

SELECT * FROM reports WHERE id IN (SELECT DISTINCT rpt FROM schedule WHERE username='name3')

答案 1 :(得分:0)

如果您只需要一次,请添加LIMIT 1

SELECT * FROM reports WHERE id=(SELECT DISTINCT rpt FROM schedule WHERE username='name3' LIMIT 1)

如果您需要所有结果,请将=更改为IN

SELECT * FROM reports WHERE id IN(SELECT DISTINCT rpt FROM schedule WHERE username='name3') 

答案 2 :(得分:0)

正确的比较是= ANYIN。但是,在使用子查询时,您不需要子查询中的SELECT DISTINCT。所以,这应该写成:

SELECT r.*
FROM reports r
WHERE r.id IN (SELECT s.rpt FROM s.schedule WHERE s.username = 'name3');

在查询中引用多个表时,应始终限定列名。这有助于防止意外错误。

答案 3 :(得分:0)

您不需要子查询。内部联接将表现更好

SELECT DISTINCT r.id,r.data FROM报告r 内部联合计划 ON r.id = s.rpt AND s.username ='name3'