2017-06-09 80 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

謝謝,這也是一個好主意,我想也許有一個子查詢會更容易。 –