我有一个应用程序,图像存储在多个类别中,当前按类别ID存储在列中作为空格分隔列表(例如,1 5 23 2)。
我有一个来自搜索过滤器的查询,该搜索过滤器当前是一个ID数组(例如,1 5)。
理想情况下,我会找到一个使用类似WHERE IN的解决方案,看看我的数组值是否存在于存储列中,尽管我没有看到一个简单的解决方案。
目前我必须查询所有图像,将它们带入PHP并使用“array_intersect”进行检查。如果我将来有10万张图像拉,然后检查,我认为这是一个问题。
有人能想到一个优雅的解决方案吗?该应用程序仍处于开发阶段,因此我可以说可以改变表格的结构。
答案 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)
WHERE FIND_IN_SET('3', categoryListColumnName) > 0 OR FIND_IN_SET('15', categoryListColumnName) > 0
使用您当前的数据库设计,您可以使用IN查询:
WHERE categoryListColumnName LIKE '% 3 %' OR categoryListColumnName LIKE '% 15 %'
并为您要查找的每个类别添加更多OR。使用此查询时,您必须确保以空格分隔的列表以空格结束并以空格开头,否则将无效。
我要重申一下,这些方法可行,但不推荐使用。