Mysql交叉两个字符串

时间:2014-01-27 18:50:22

标签: php mysql sql

我有以下表格:

TableFinal

column id, with first row having value 1
column numbers, with first row having value `1,5,6,33,2,12,3,4,9,13,26,41,59,61,10,7,28`

并且

TablePick

column id, with first row having value 1
column numbers, with first row having value 2,12,26,33

我想检查来自TablePick,“selected”列的数字是否包含在TableFinal的“数字”列中。

我必须提到,在TablePick中,“selected”列中的数字是ASC排序,而在TableFinal中,“number”列中的数字是混洗的。

通常我会使用PHP将它们中的每一个放在一个数组中,然后将两个数组相交并计算结果数组。但是在MYSQL中,它并不那么简单,所以实际上我不知道从哪里开始。

也许我应该创建一个ARRAY_INTERSECT函数?或者我们有一个更简单的解决方案吗?

SELECT * FROM TablePick p RIGHT JOIN TableFinal f ON f.id=p.id WHERE ARRAY_INTERSECT(p.selected,f.numbers)

1 个答案:

答案 0 :(得分:1)

很抱歉这么说,但您的架构需要一些严格的维护:永远不会在一个字段中存储多个信息,如果您需要单独访问它们。

你需要一对连接表,而不是第一行(1, "1,5,6,33,2,12,3,4,9,13,26,41,59,61,10,7,28")你有行

(1,1)
(1,5)
(1,6)
(1,33)
...

而不是行(1, "2,12,26,33"),你有行

(1,2)
(1,12)
(1,26)
(1,33)

现在您只需查询:

SELECT ... FROM TableFinal 
INNER JOIN TABLE TablePick ON TableFinal.number=TablePick.number
WHERE TableFinal.id=1
AND TablePick.id=1

修改

请理解,即使没有MySQL滥用这种情况也是可能的,一旦行数开始上升,它就会成为性能杀手:如果表格有n行和m行,我们说的是n * m数组相交respectivly。