2013-02-09 104 views
0

表A選擇形式表A,其中表B值

id name 
1  name1 
2  name2 
3  name3 
4  name4 

表B

id userlist 
1  1,2,3,4 

我做什麼,現在是

SELECT `userlist` FROM `table B` WHERE `id` = 1 

然後保存結果並投入第二查詢

SELECT `name` FROM `table A` WHERE `id` in ($userlist) 

只是想知道如果有更好的方法。我試試

SELECT `name` FROM `table A` WHERE `id` in (SELECT `userlist` FROM `table B` WHERE `table B`.`id` = 1) 

但它只返回1個結果。

編輯*

DB結構不能改變,因爲裏面的數據太多了。我只是嘗試優化舊的代碼。

+6

在表的單個字段中使用逗號分隔值通常是一個壞主意。你應該考慮你的數據表示。 – 2013-02-09 10:37:10

+0

正常化您的數據庫,然後您可以使用'IN'或'WHERE EXISTS' – knittl 2013-02-09 10:40:07

+1

參見[在數據庫列中存儲分隔列表真的很糟糕嗎?](http://stackoverflow.com/a/3653574) – eggyal 2013-02-09 10:48:55

回答

3

你可以使用FIND_IN_SET

SELECT `name` 
FROM `table A` INNER JOIN `table B` ON 
    FIND_IN_SET(`table A`.`id`, `table B`.`userlist`) 
WHERE `table B`.`id` = 1 

但我建議你規範你的表。

+0

謝謝。這爲我工作 – 2013-02-09 10:52:06

2

解決此問題的正確方法是更改​​表格定義並使用JOIN。例如

表A

id name b_id 
1  name1 1 
2  name2 1 
3  name3 1 
4  name4 1 

表B

id  
1 

要想從表A中具有B- ID 1名,你可以這樣寫:

select name from A join B on A.b_id = B.id where B.id = 1 

或者,如果您不能更改表A,定義一個新表以維護關係AB:

表A

id name 
1  name1 
2  name2 
3  name3 
4  name4 

表B

id  
1  

表A_B

a_id b_id 
1 1 
2 1 
3 1 
4 1 

SQL來提取數據:

select name from A join A_B on A.id = A_B.b_id where A_B.b_id = 1 
+1

+1 - 你打敗了我13秒;) – 2013-02-09 10:41:38

+0

感謝您的回答。對不起,告訴。數據庫結構不能改變,因爲我不是創建它的人。我只是試圖優化它。 – 2013-02-09 10:44:38

+0

@MuhammadAzizol告訴創建表格的derp來改進它們。或者更好的是,用沉重的東西擊中他。非規範化的表格是一種更好的立即根除,而不是稍後處理。 – 2013-02-09 10:47:23

相關問題