2012-03-29 127 views
1

我有存储在多个类别,目前储存按类别ID列中的作为空格分隔列表(例如1 5 23 2)图像的应用。SQL查询,比较两个阵列

我有来自搜索过滤器,这是目前的ID的阵列,(例如,1 5)的查询。

理想情况下,我会使用类似凡在会看看我的任何数组值的存储列存在的,虽然我没有看到一个简单的解决找到一个解决方案。

目前,我必须查询所有的图像,使它们PHP和检查那里,用“array_intersect”。我认为这是一个问题,如果我将来有100,000个图像可以拉动然后检查。

任何人都可以想到的是优雅的解决方案吗?应用程序仍在开发中,所以我可以改变我的表格结构。

+1

优雅的解决方案是不按照您的方式将ID存储在数据库中。你应该每行存储一个图像ID,那么你的查询就会简单得多。我强烈建议您在太迟之前修改您的架构。 – 2012-03-29 14:58:05

回答

2

我想添加一个映射表很可能是最好的在这里它与CATEGORY_ID的image_id映射。

+0

感谢您的回答。现在你已经说过了,它显而易见!所以,第三个表格带有相应的ID。再次感谢。 – 2012-03-29 15:01:14

1

重构你的数据库表!

使用某事像这样:

table_image ID INT 名文字, 内容的文字, ...

和第二表的类别:

table_category ID INT, image_id int, 类别int

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

SELECT table_image.id FROM table_image,table_category WHERE table_image.id = table_category.image_id和table_category.category = $ cat_arr [0]或table_category.category = $ cat_arr [1]。 ..

+0

谢谢!已经做到了,我想我只是在脑中打嗝。 – 2012-03-29 15:13:37

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 %' 

,并添加更多或对要找到每一个类别。当使用这个查询时,你必须确保你的列表以空格分隔,并以一个空格开始,否则它将不起作用。

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