2015-01-02 35 views
-4

MySQL表這樣Mysql的子查詢語句家長山口

表A

a_id a_name 
1  zone1 
2  zone2 
3  zone3 
..... 

表B

b_id b_name FK_id 
1  field1 1,2,3 
2  field2 2,3 
....... 

SQL

select b.b_name, (SELECT GROUP_CONCAT(a.name) 
         FROM TableA WHERE a_id IN(**FK_id**)) 
FROM TableB b 
WHERE b.b_id=1 

SQL結果: [FIELD1] [zone1的]

但我手動更改這樣的SQL

select b.b_name, (SELECT GROUP_CONCAT(a.name) 
        FROM TableA WHERE a_id IN(1,2,3)) 
FROM TableB b 
WHERE b.b_id=1 

SQL結果:[FIELD1] [zone1的,zone2的,3區]

什麼問題我不明白。

我想需要你的意見,謝謝

+1

你有什麼不明白的,會發生什麼? –

+0

我希望成爲第一條語句,其輸出結果如同第二條結果(SQL結果:[field1] [zone1,zone2,zone3]) – turkgenc

+1

請參閱規範化。 – Strawberry

回答

0

不要。永遠。商店。在關係數據庫中分隔值!

而不是將a_id s作爲TableB中的值的分隔列表,而應該創建一個主鍵(多對多)表TableB_TableA。你的架構看起來像

CREATE TABLE tablea 
(
    a_id INT NOT NULL PRIMARY KEY, 
    a_name VARCHAR(255) 
); 

CREATE TABLE tableb 
(
    b_id INT NOT NULL PRIMARY KEY, 
    b_name VARCHAR(255) 
); 

CREATE TABLE tableb_tablea 
(
    b_id INT NOT NULL, 
    a_id INT NOT NULL, 
    PRIMARY KEY (b_id, a_id), 
    FOREIGN KEY (b_id) REFERENCES tableb (b_id), 
    FOREIGN KEY (a_id) REFERENCES tablea (a_id) 
); 

現在得到您想要的輸出,你會發出以下查詢

SELECT b.b_name, GROUP_CONCAT(a.a_name) a_name 
    FROM tableb_tablea ba JOIN tableb b 
    ON ba.b_id = b.b_id JOIN tablea a 
    ON ba.a_id = a.a_id 
WHERE ba.b_id = 1 
GROUP BY ba.b_id 

輸出:

 
| B_NAME |   A_NAME | 
|--------|-------------------| 
| field1 | zone1,zone2,zone3 | 

這裏是一個SQLFiddle演示

絕對必要的閱讀

0

爲什麼不可能?這是子查詢,「IN」值來自父級,即1,2,3。

這很重要,因爲如果我手動寫入「IN」值,它是工作(1,2,3)沒有問題, 但是父項COL的相同值只有一個項目(1)工作。

我有很大的查詢,因此「我必須使用」子查詢和子查詢來多列,我把它連接到一個列。

除此之外,我發現了一些東西,如果我使用「NOT」和IN它的工作。但是這次的正確數據並沒有來其他數據來。

SQL

select b.b_name, (SELECT GROUP_CONCAT(a.name) 
         FROM TableA WHERE a_id **NOT** IN(**FK_id**)) 
FROM TableB b 
WHERE b.b_id=1