2017-06-21 30 views
-2

我必須在一個sql語句中比較兩個逗號分隔的列表。在mysql中相交逗號分隔的列表

基本上它是查詢一個目錄表,其中一列中有一個以逗號分隔的ID列表,並且搜索目標表格再次返回一個ID列表。

我想這

SELECT * FROM target_table 
WHERE commaSeparatedListInOneColumn IN (
SELECT id FROM searchTable WHERE name LIKE '%searchString%') 

,但我沒有得到數據。請幫我解決這個問題。

+0

問題是? –

+4

現在你明白了爲什麼在一列中將逗號分隔的列表中的數據存儲**是一個可怕的想法**。重構你的數據庫設計 – RiggsFolly

+0

所以這是我正在使用的框架的設計。條件被查詢的對象struckture。所以它不是更改數據庫結構的選項。 –

回答

1

你可以寫這樣的查詢

SELECT * FROM target_table 
     WHERE commaSeparatedListInOneColumn REGEXP (
     SELECT GROUP_CONCAT(id SEPARATOR '|') FROM searchTable WHERE name LIKE '%searchString%' group by name 
    ) 

希望這有助於。

+0

謝謝,這就是我一直在尋找的。 –

0

如果commaSeparatedListInOneColumn包含類似1,2,3,45 價值和你有一樣的字符串和12,2,4,5如果要檢查所有的12,2,4,5 IDS存在於commaSeparatedListInOneColumn與否。

然後你可以在find_in_set()的幫助下做到這一點。

就這樣

$ids='12,2,4,5'; 
$filterKeys = explode(',',$ids); 
$searchQuery=''; 
foreach ($filterKeys as $word) { 
    $word = trim($word); 
    if ($word) { 
     $searchQuery = $searchQuery . "find_in_set('$word', trim(`commaSeparatedListInOneColumn`)) > 0 or "; 
    } 
} 
$searchQuery = chop($searchQuery, ' or '); 
$finalQuery="SELECT * FROM target_table WHERE $searchQuery"; 

這裏$finalQuery包含查詢它看起來像這樣

SELECT * FROM target_table 
WHERE find_in_set('12', trim(`commaSeparatedListInOneColumn`)) > 0 or 
find_in_set('2', trim(`commaSeparatedListInOneColumn`)) > 0 or 
find_in_set('4', trim(`commaSeparatedListInOneColumn`)) > 0 or 
find_in_set('5', trim(`commaSeparatedListInOneColumn`)) > 0 

我的東西它會幫助你的。