如何在sql中存储然后搜索CSV?

时间:2011-11-11 19:56:25

标签: mysql arrays csv

我知道我可以使用IN(1,2,3)从SQL数据库中选择值为1,2或3的项目,但是如果我在MYSQL中有一个字符串值,那该怎么办?等于'1,2,3',我想选择该值。据我所知,我必须这样做:

SELECT whatever FROM wherever WHERE sqlvariable = '1' OR sqlvariable LIKE '1,%' OR `sqlvariable` LIKE '%,1,%' OR `sqlvariable` LIKE '%,1'

如果我想反过来模拟'IN'那么这很好。但是让我说我​​想选择sql变量,它包含1或2,然后我必须这样做:

SELECT whatever FROM wherever WHERE sqlvariable = '1' OR sqlvariable LIKE '1,%' OR `sqlvariable` LIKE '%,1,%' OR `sqlvariable` LIKE '%,1' OR sqlvariable = '2' OR sqlvariable LIKE '2,%' OR `sqlvariable` LIKE '%,2,%' OR `sqlvariable` LIKE '%,2'

现在假设我使用PHP生成上述查询,我​​希望找到包含1 2 4 66 34 33 22 44或992的sql变量。这个查询运行需要很长时间

我可以做一个按位实现,但后来我只限制了大约60个不同的项目,这是不够的。

有没有更快的方法在sql中使用如上所述的CSV查询?我想它有点像IN()但反过来。

1 个答案:

答案 0 :(得分:4)

您可以使用FIND_IN_SET简化查询:

SELECT whatever
FROM   wherever
WHERE  FIND_IN_SET('1', sqlvariable)
OR     FIND_IN_SET('2', sqlvariable)

然而,这仍然需要搜索表格中的每一行。最好重新设计数据库,以便不需要CSV格式的数据。


更新:您现有的设计看起来像这样:

groupname   groupmembers
Group1      1,2,3
Group2      3,4

您应该将其更改为更像这样的内容:

groupid   groupmember
1         1
1         2
1         3
2         3
2         4