这是一个相当特殊的问题:
id | column_num |
---|----------------|
1| 5,12,64,7,78 |
2| 5,53,7,6 |
3| 94,78,32,27 |
我需要找到具有以下值的行:12,7,78
我需要查找与单元格SQL对应的多个值。 我使用MySQL。你有个主意吗?
谢谢
答案 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 .= ') ';
}