【发布时间】:2013-10-09 15:37:15
【问题描述】:
以前曾以不同的方式提出过这个问题,但我似乎无法得到适合我确切需要的东西。
这里的目标是创建一个搜索查询,根据所选标签返回照片。许多标签可以同时应用于过滤器,这需要使查询只返回选择了所有标签的照片。想想在执行基本关键字搜索后您正在缩小结果范围的任何主要网上商店。
表 1:照片 ID|标题|描述|URL|已创建
表 2:PhotosTagsXref ID|PhotoId|TagId
表 3:照片标签 ID|标题|类别
我有什么:
SELECT p.* FROM `PhotosTagsXref` AS pt
LEFT JOIN `Photos` AS p ON p.`ID` = pt.`PhotoId`
LEFT JOIN `PhotosTags` AS t ON pt.`TagId` = t.`ID`
WHERE p.`Description` LIKE "%test%" AND
????
GROUP BY p.`ID`
ORDER BY p.`Created` DESC LIMIT 20
????是我尝试了很多东西但被难住的地方。问题是我可以轻松找到包含带有一个或另一个标签的照片的结果集,但如果应用 2、3 或 4 个标签,我们只需要返回在数据库中包含所有这些标签条目的照片。我认为这将涉及合并结果集,但不是 100% 确定。
示例: 照片 1 标签:蓝色、白色、红色 照片 2 标签:蓝色
搜索带有“蓝色”标签的照片会返回两张照片,搜索带有“蓝色”和“白色”标签的照片只会返回照片 1。
【问题讨论】:
-
也许 CONTAINS 子句会对你有所帮助。
-
我会使用内部连接到子选择语句。您如何构建此查询以及如何获取输入?如果标签数量有上限,那么您可以在此处执行仅 SQL 语句。如果您对标签没有限制,那么您需要在构建 sql 语句时更加动态。
-
按照下面的解决方案进行内部连接可以解决问题,谢谢。该查询是从 GET 请求构建的,包含一个过滤器数组变量,理论上无限数量的标签。有一个逻辑限制,但我想它可能在 10 - 20 范围内。
-
我把它放在我的答案中......但只是对 MySQL 的警告......它根本不能很好地处理子选择(查询引擎对它的评估很差)。 where exists 的性能比 where in 好,但是如果你期望这个数据库增长任何,我会非常警惕在 MySQL 中实现子查询(我对这个问题的解决方案是使用 Postgres 而不是 MySQL :))