SQL查询,比较两个数组

时间:2012-03-29 14:55:20

标签: php mysql arrays

我有一个应用程序,图像存储在多个类别中,当前按类别ID存储在列中作为空格分隔列表(例如,1 5 23 2)。

我有一个来自搜索过滤器的查询,该搜索过滤器当前是一个ID数组(例如,1 5)。

理想情况下,我会找到一个使用类似WHERE IN的解决方案,看看我的数组值是否存在于存储列中,尽管我没有看到一个简单的解决方案。

目前我必须查询所有图像,将它们带入PHP并使用“array_intersect”进行检查。如果我将来有10万张图像拉,然后检查,我认为这是一个问题。

有人能想到一个优雅的解决方案吗?该应用程序仍处于开发阶段,因此我可以说可以改变表格的结构。

3 个答案:

答案 0 :(得分:2)

我认为在这里添加一个地图表可能是最好的,它将image_id与category_id进行映射。

答案 1 :(得分:1)

重构你的数据库表!!!

像这样使用:

table_image id int 姓名文字, 内容文字, ...

和第二个类别表:

table_category id int, image_id int, category int

这样,您可以使用外键将类别存储在单独的表中。现在,你可以做简单的SQL查询,比如

SELECT table_image.id FROM table_image,table_category WHERE table_image.id = table_category.image_id and table_category.category = $ cat_arr [0] OR table_category.category = $ cat_arr [1] ...

答案 2 :(得分:1)

H Hatfield有最好的答案。如果您确实必须使用单个列(我不建议使用),您可以将类别存储为逗号分隔列表而不是空格。然后,您可以使用MySql函数find_in_set,如下所示:

WHERE FIND_IN_SET('3', categoryListColumnName) > 0 OR FIND_IN_SET('15', categoryListColumnName) > 0

使用您当前的数据库设计,您可以使用IN查询:

WHERE categoryListColumnName LIKE '% 3 %' OR categoryListColumnName LIKE '% 15 %'

并为您要查找的每个类别添加更多OR。使用此查询时,您必须确保以空格分隔的列表以空格结束并以空格开头,否则将无效。

我要重申一下,这些方法可行,但不推荐使用。