在SQL中查找多个值中的多个值

时间:2016-10-07 07:33:53

标签: mysql sql where

这是一个相当特殊的问题:

 id |   column_num   |
 ---|----------------|
   1|  5,12,64,7,78  |
   2|  5,53,7,6      |
   3|  94,78,32,27   |

我需要找到具有以下值的行:12,7,78

我需要查找与单元格SQL对应的多个值。 我使用MySQL。你有个主意吗?

谢谢

4 个答案:

答案 0 :(得分:1)

好的,我已经提出解决方案并希望这对你有所帮助。

  

注意:您可以自己规范化查询,因为我只是分享我的   关于这个问题的概念。

查询如下: -

CREATE TABLE table1
(
    id int,
    column_num varchar (max)
) 

INSERT INTO table1 (id, column_num) VALUES
(1, '5,12,64,7,78'),
(2, '5,53,7,6'),
(3, '94,78,32,27'),
(4, '1,74,32,12,78')

CREATE VIEW vSeperate_Num AS
WITH tmp(id, num, column_num) AS
(
    SELECT id, LEFT(column_num, CHARINDEX(',',column_num+',')-1), STUFF(column_num, 1, CHARINDEX(',',column_num+','), '')
    FROM table1
    UNION ALL
    SELECT id, LEFT(column_num, CHARINDEX(',',column_num+',')-1), STUFF(column_num, 1, CHARINDEX(',',column_num+','), '')
    FROM tmp
    WHERE column_num > ''
)
SELECT id, num
FROM tmp

;WITH Contain_Selected_Num AS
(
    SELECT *
    FROM
    (
        SELECT id, num
        FROM vSeperate_Num
    ) AS pvt
    PIVOT
    (
        COUNT(num)
        FOR num IN ( [12], [7], [78] )
    ) AS pvt
)
SELECT *
FROM table1
WHERE id IN
(
    SELECT id
    FROM Contain_Selected_Num
    WHERE [12] > 0 AND [7] > 0 AND [78] > 0
)

谢谢。 :)

答案 1 :(得分:1)

至少要匹配一个,试试:

select * From table_name where 
column_num = '12' or column_num like '%,12,%' or column_num like '%,12' or column_num like '12,%'
union 
select * From table_name where 
column_num = '7' or column_num like '%,7,%' or column_num like '%,7' or column_num like '7,%'
union 
select * From table_name where 
column_num = '78' or column_num like '%,78,%' or column_num like '%,78' or column_num like '78,%'

拥有所有三个值,请尝试此SQL:

select * From table_name where (column_num = '12' or column_num like '%,12,%' or column_num like '%,12' or column_num like '12,%')
and (column_num = '7' or column_num like '%,7,%' or column_num like '%,7' or column_num like '7,%')
and (column_num = '78' or column_num like '%,78,%' or column_num like '%,78' or column_num like '78,%')

答案 2 :(得分:1)

您可以尝试以下操作:

在每个字符串的开头和结尾添加,,即5,12,64,7,78 - > ,5,12,64,7,78,

然后,您可以为每个号码应用MySQL的locate()函数。

select id, column_num from (
select id, column_num,
       locate(',12,', column_num) as m12, 
       locate(',7,', column_num) as m7, 
       locate(',78,', column_num) as m78 
from your_table
) a
where m12 > 0 and m7 > 0 and m78 > 0;

如果字符串中没有特定数字,则locate的结果将为0,否则它将是字符串中的位置。在外部查询中,您可以在where语句中检查此内容。

where声明可以根据您的需要轻松调整,例如如果您需要所有三个数字或至少一个数字的匹配。

答案 3 :(得分:1)

感谢您的回答。 我必须通过函数FIND_IN_SET找到一个解决方案,通过使用PHP进行卷曲。

$_POST['test_ids'] = [12,7,78];

if (!empty($_POST['test_ids'])) {
    $filter .= ' AND (';
    $i = 0;
    foreach ($_POST['test_ids'] as $id) {
        $filter .= ($i > 0) ? ' OR ' : '';
        $filter .= ' FIND_IN_SET(\'' . $id . '\', column_num) ';
        $i++;
    }
    $filter .= ') ';
}