使用查询避免MySql循环

时间:2012-05-31 17:12:40

标签: mysql sql

我有三张桌子。

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

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

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

关键是关键字列表可以是任意数量的单词。如果我使用类似IN的内容('关键字','数组','返回','全部','结果'),我只会获得与 ANY 有关系的所有包的列表当我只想要与关键字的 ALL 有关系的包时的关键字。

思想?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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