php – 在mysql表中查找标记项的出现
假设我有这张表:
item_id tag_id ------- ------ 1 1 1 2 2 2 2 3 正如您可能想象的那样,它是一个表格,其中我引用了属于它们的一些项目和标签.一个项目可以有多个标签,并且可以为多个项目选择一个标签. 假设我还有一个特定的标签集合(f.ex.tag_id = 50,73和119)和一个带有id的“items”表(由item_id引用). 是否有一个有效的查询给我: >带有这些标签的商品数量 我试过的 SELECT COUNT(*) FROM ( SELECT COUNT(*) AS c FROM items_tags it JOIN items i ON i.id = it.item_id WHERE (tag_id=7 OR tag_id=95 OR tag_id=150) AND `status`='active' GROUP BY item_id ) t1 WHERE c=3 <-- c= number of tags 我可以有两个结果,但有一个非常(似乎)低效的查询.在使用EXPLAIN进行检查后,我想摆脱OR给出的“范围”. 改进我的问题:问题是我得到了一个写得很差的PHP框架,它通过各种标签ID迭代了900次.假设您有一个或多个固定ID(所选标签)并且它遍历所有900个标签以查找具有共同给定标签的项目的发生次数加上迭代的标签(它是改进搜索的功能),仅显示具有所有给定标签的元素加一个). 给定的代码以这种方式工作:我选择一个或多个标签,并将它们的ID放入查询字符串.假设我选择了标签54和77. 然后,它提供了改进搜索的选择,这里有一个奇怪的部分:PHP代码循环通过所有900个标签,并且每次迭代它都需要一个标签,并计算有多少项目包含所有标签54,77和迭代中的那一个. 以较少“密集”的方式获得相同的结果会很好. 解决方法
要获取与所有标记匹配的项ID列表,可以使用以下查询:
SELECT items.id FROM items JOIN items_tags ON items.id = items_tags.item_id WHERE (items_tags.tag_id IN (7,95,150)) AND (items.status = 'active') GROUP BY items.id HAVING COUNT(DISTINCT items_tags.tag_id) = 3 请注意,如果您确定从未对同一项目使用重复标记,则可以将COUNT(DISTINCT items_tags.tag_id)替换为COUNT(*)以提高效率. 要获取这些项的计数,请将其包装在COUNT个查询中: SELECT COUNT(*) FROM ( SELECT items.id ... ) t 要获取项目列表,请将其包装在此SELECT查询中: SELECT * FROM items WHERE id IN ( SELECT items.id ... ) UPDATE 要在与原始列表组合时获取每个剩余标记的项目计数,您可以执行以下操作: SELECT tag_id,COUNT(DISTINCT item_id) FROM items_tags WHERE item_id IN ( SELECT items.id ... ) AND tag_id NOT IN (7,150) GROUP BY tag_id (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |