MySQL字符串设置和获取交集

时间:2012-09-07 11:16:44

标签: mysql sql math boolean set

我有一个糟糕的投影数据库,在“1,2,5,10”等文本列中有ID集。我需要得到两列的交集,它们以相同的方式设置。 我不喜欢使用PHP或其他脚本语言,我也不喜欢MySQL自定义函数。 有没有办法得到逗号分隔符字符串给出的两组交集?

实际上我不需要有完整的交集,我只需要知道两组中是否有相同的数字。如果是,我需要“1”,如果没有相同的数字,我需要“0”。

谢谢。

2 个答案:

答案 0 :(得分:3)

你可以使用REGEXP来做一些聪明的替换。

认为应该这样做(免责声明:尚未对其进行广泛测试):

SELECT col1,
       col2,
       CONCAT('(', REPLACE(col2, ',', '(\\,|$)|'), '(\\,|$))') AS regex,
       col1 REGEXP CONCAT('(', REPLACE(col2, ',', '(\\,|$)|'), '(\\,|$))') AS intersect
FROM tbl

请参阅http://sqlfiddle.com/#!2/7b86f/3

解释:这会将col2转换为正则表达式,以便与col1进行匹配。 (\,|$)位与逗号或字符串结尾匹配。希望这会有所帮助...

答案 1 :(得分:0)

史蒂夫的代码在所有情况下都不起作用。 对于e.x,当在另一个号码中找到号码时,它不起作用。 INSERT INTO tbl(col1,col2) 价值观('60,61,64,68,73','14,16,17,18,1'); 通过一些调整,它可以工作:

SELECT col1,
col2,
CONCAT('((\\,)', REPLACE(col2,',', '(\\,)|(\\,)'), '(\\,))') AS regex,
CONCAT(',',col1,',') REGEXP CONCAT('((\\,)', REPLACE(col2,',', '(\\,)|(\\,)'), '(\\,))') AS intersect
FROM tbl