使用 GROUP BY 并聚合所有搜索值的 MySQL 查询

问题描述 投票:0回答:2

我有三张桌子。

表1为封装。 表 2 是 package_to_keyword。 表3是关键词。

包可以连接多个关键字。因此,如果我查询 package_to_keyword 连接关键字和包,我可以搜索与某个关键字相关的所有包。这就是我理解的部分。 enter image description here

现在...我的问题是,如何检索与关键字列表匹配的包?现在,在 php 中,我循环一条 sql 语句,然后循环遍历每个关键字的所有结果,并执行 array_intersect() 来过滤到所有结果集中显示的包。但是,我确信这很糟糕,因为当我确定 SQL 是为处理这种类型的关系而构建时,我正在为每个关键字运行查询,我只是不确定要执行什么类型的查询。

关键是关键字列表可以是任意数量的单词。如果我使用类似 IN ('keyword','array','returns','all','results') 的东西,我只会得到与关键字 ANY 有关系的所有包的列表,当我只是想要与关键字中的ALL有关系的软件包。

想法?

sql mysql group-by aggregate having
2个回答
3
投票
select title
from packages p
inner join pack_to_tag pt on p.index = pt.pIndex
inner join keyworks w on w.index = pt.kindex
where word in ('keyword','array','returns','all','results')
group by title
having count(*) = 5

2
投票

首先,“预查询”(合格产品结果)仅查找与您要查找的任何关键字相连接的产品,最终将返回 1 个或多个条目。然后 GROUP BY 确认您期望的数量...然后加入产品以获得最终结果。

select
      p.*
   from
      ( select ptt.pIndex
           from pack_to_tag ptt
                   join keywords k
                      on ptt.kindex = k.index
                     and k.word in ( 'word1', 'word2', 'word3' )
           group by 
              ptt.pIndex
           having 
              count(*) = 3 ) QualifiedProducts
      join Products p
         on QualifiedProducts.pIndex = p.index
© www.soinside.com 2019 - 2024. All rights reserved.