2012-12-28 16 views
1

我有兩個MySQL表是這樣的:CSV在條件Mysql的

表A

[name] | [id] 
--------------------- 
Shirts  1, 10, 16, 18 
Pants  14, 11 
Skirts  19, 13, 15 

表B

[id] | [s_id] 
--------------------- 
ABC   1 
AC   1 
DE   10 
DEC   19 
ACD   16 
BCD   18 
BCO   18 

現在我需要從TableB得到id s表示匹配s_id即從任何給定的名稱。

查詢應該是這樣的:

SELECT id 
    FROM TableB 
    WHERE s_id IN (SELECT id 
        FROM TableA 
        WHERE name = 'Shirts') 

所以子查詢返回1, 10, 16, 18(CSV)。但我知道這不能在子查詢中像這樣使用。

任何想法?

+1

你有什麼是一個非常糟糕的模式。由於我真的不明白表中的這些id是什麼,所以我很難給出如何解決該模式的答案。你能用現實世界的術語來解釋表格代表什麼,所以可以給出如何解決你的模式的建議? –

+0

我明白架構狀況不佳。但不幸的是,我不能改變這個模式,因爲它剛剛開發了一個現有的現場產品。 –

+1

它總是讓我驚訝,人們問這些問題的時候經常說「我不能改變模式」。有時在軟件開發模式中需要改變,尤其是在你試圖以前沒有做過的方式查詢數據的情況下。 –

回答

1

你可以試試這個。這個查詢將需要一個完整的表掃描,所以我希望你的表不是很大。

SELECT id 
FROM TableB 
WHERE FIND_IN_SET(s_id, (SELECT id FROM TableA WHERE name = 'Shirts')) IS NOT NULL 
+0

我會嘗試這一個。希望這應該工作 –

2

試試這個:

SELECT b.id, b.s_id 
FROM TableB b 
INNER JOIN TableA a ON FIND_IN_SET(b.s_id, REPLACE(a.id, ' ', '')) 
WHERE a.name = 'Shirts'; 
+0

這有兩個問題。首先是逗號分隔的值在逗號後面有空格,這會使FIND_IN_SET()混淆。其次是FIND_IN_SET()返回集合中找到的值的索引,而不是值本身。試試看:select find_in_set('16','1,10,16,18') –

+0

@SlipperyPete:第二個問題不是真的有問題。如果expr1是「在set中找到」expr2,那麼返回值是一個正整數,在布爾上下文中它的值爲TRUE。另一個大問題是性能。 – spencer7593

+0

@SlipperyPete我們可以使用REPLACE關鍵字刪除空格檢查我更新的答案。第二個答案是我們想要檢查該字符串中id是否存在的天氣,它將通過FIND_IN_SET完成。 –