2012-05-31 133 views
0

我有三張表。避免帶查詢的MySql循環

表1是包裝。 表2是package_to_keyword。 表3是關鍵字。

軟件包可以連接到多個關鍵字。因此,如果我查詢package_to_keyword加入關鍵字和包,我可以搜索與特定關鍵字相關的所有包。這是我理解的部分。 enter image description here

現在......我的問題是,如何檢索匹配關鍵字列表的軟件包?現在,在PHP中,我循環一條sql語句,然後遍歷每個關鍵字的所有結果,並執行array_intersect()過濾到所有結果集中顯示的包。不過,我敢肯定這是不好的,因爲我對每個關鍵字運行查詢時,我確定SQL是用來處理這種類型的關係,我只是不確定執行什麼類型的查詢。

關鍵是關鍵字列表可以是任意數量的單詞。如果我使用IN('關鍵字','數組','返回','全部','結果'),我只是得到一個列表,所有與有關係的包都是想要與有關係的包全部的關鍵字。

想法?

回答

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 
+0

不錯,你糾正了這個答案,就像我正要-1它;)+1現在代替。 – MatBailie

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