2017-06-09 101 views
0

我有2个表像这样的: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 | 

当输入用户名搜索,我想检查计划表中所有这个名字的出现在报告的IDS(它可能每个报告出现多次,我只需要一次),然后用报告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 

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

+0

正如你在日程安排表中有多个带有'name3'的记录,它将返回所有带有'name3'的记录,如果子查询有多行,那么你不能将它与'ID'和'='进行比较。 –

回答

0

适当的比较是= ANYIN。但是,在使用子查询时,子查询中不需要SELECT DISTINCT。因此,这应该写为:

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

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

+0

谢谢,这有助于......实际上,在我的原始代码中,我确实包括了表名称点列名称。再次感谢。 –

0

我觉得您的查询应该是:

SELECT * FROM reports WHERE id IN (SELECT DISTINCT rpt FROM schedule WHERE username='name3') 
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') 
+0

谢谢,非常感谢。 –

0

你不需要子查询。内部连接的性能会更好

SELECT DISTINCT r.id,r.data FROM报告[R INNER JOIN表小号 ON r.id = s.rpt AND s.username = 'NAME3'

+0

谢谢,这也是一个好主意,我想也许有一个子查询会更容易。 –