0

我有三张桌子。

表 1 是包装。表 2 是 package_to_keyword。表 3 是关键字。

包可以连接到多个关键字。因此,如果我查询 package_to_keyword 加入关键字和包,我可以搜索与某个关键字相关的所有包。这是我理解的部分。 在此处输入图像描述

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

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

想法?

4

2 回答 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
于 2012-05-31T17:21:33.507 回答
2

首先,“PreQuery”(合格产品结果)仅查看与您正在寻找的任何关键字的关键字相连的产品,并最终返回 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
于 2012-05-31T17:29:00.620 回答