加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

php – 在mysql表中查找标记项的出现

发布时间:2020-12-13 16:50:13 所属栏目:PHP教程 来源:网络整理
导读:假设我有这张表: item_id tag_id------- ------1 11 22 22 3 正如您可能想象的那样,它是一个表格,其中我引用了属于它们的一些项目和标签.一个项目可以有多个标签,并且可以为多个项目选择一个标签. 假设我还有一个特定的标签集合(f.ex.tag_id = 50,73和119)
假设我有这张表:

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.
代码必须找到具有BOTH标签54和77的项目的每个项目ID,并逐个列出它们:我们获得“具有所选标签的项目”列表.

然后,它提供了改进搜索的选择,这里有一个奇怪的部分:PHP代码循环通过所有900个标签,并且每次迭代它都需要一个标签,并计算有多少项目包含所有标签54,77和迭代中的那一个.
如果计数> 0,它显示带有计数的标签名称,过滤掉其项目没有任何链接到所选标签的每个标签.

以较少“密集”的方式获得相同的结果会很好.

解决方法

要获取与所有标记匹配的项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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读