我有两个表格,如:
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
name1
:1110 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
解决问题的正确方法是什么?
答案 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)
正确的比较是= ANY
或IN
。但是,在使用子查询时,您不需要子查询中的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'