2017-06-21 26 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 

我的东西它会帮助你的。