2017-04-26 47 views
0

我有兩個表比賽MySQL表記錄反之亦然

  1. 主詞

    ID |文字
    1 |機器
    2 |電話

  2. 替代詞

    ID | primary_id | word
    1 | 1 |系統
    2 | 1 |功能
    3 | 2 |電話

  3. 產品表

    ID |名稱|
    1 |移動系統
    2 |電腦機器
    3 |有線電話

現在扭曲的是,每當在產品表與「機」的用戶搜索,然後顯示與表名產品的結果有「機」或「系統」或「功能」,如果用「系統」搜索或「特徵」,然後還顯示「機器」或「系統」或「特徵」或「副」的結果。

請問我可以怎麼解決這個問題?

+1

這將有助於顯示您正在使用的查詢。還有,要清楚的是:在任何系統中,用戶鍵入「machine」,執行搜索(上述db查詢運行),它返回3行「machine」,「system」,「feature」? – DesertFox

+0

使用第一個表中的'id'和第二個表中的'primary_id'? – bansi

+0

請向我們展示您嘗試過的內容,因爲這只是當前的代碼請求。 – Shadow

回答

1

如果我理解你正在問的是什麼......

SQL

SELECT * 
    FROM Product P 
WHERE EXISTS(SELECT fw.Word --(6) select all products that exist in this query 
       FROM (SELECT pw.Word --(1) select all Primary words matching input 
         FROM PrimaryWords pw 
         WHERE pw.Word = 'machine' 
         UNION --(3) union the results from both selects 
         SELECT aw.Word --(2) select all Alternative words that match input or have its primary matching it 
         FROM PrimaryWords pw INNER JOIN AlternativeWords aw 
          ON pw.Id = aw.PrimaryId 
         WHERE pw.Word = 'machine' 
          OR aw.Word = 'machine') as fw --(4) alias the result 
       WHERE p.Name LIKE '%' || fw.Word || '%'); -- (5) filter products that match the valid words 

就可以讀取編號訂購的評論中()。

+0

謝謝,@DesertFox很棒。但是現在轉彎是我有產品表,所以需要與產品名稱匹配。意味着每當用戶將搜索機器,然後需要顯示與機器,系統和功能相關的產品,這是我在我的問題中提到的。 – Kamlesh

+0

那麼,現在有一個產品表?伴侶,你應該閱讀你的問題並適當地更新它。 – DesertFox

+0

是的,它已更新。請檢查並告訴我們您是否有任何想法? – Kamlesh

-1

我建議把它放在一個表是這樣的:

id | primary_id | word 
1 | 1 | machine 
2 | 2 | phone 
3 | 1 | system 
4 | 1 | feature 
5 | 2 | telephone 

和查詢會是這樣,讓我們​​machine字爲例:

Select word from MyTable where primary_id in 
      (select primary_id from MyTable where word = "machine") 

輸出:machinesystemfeature


更新

如果您有更多的列,例如顯示多少相關的這些話,你可以添加更多的表來話之間進行映射,如下所示:

id | w1_id | w2_id | relation 
1 | 1 | 3 | 80 
2 | 2 | 5 | 90 
3 | 1 | 4 | 60 
4 | 3 | 4 | 60 

而字表將只列出類的話語:

id| word 
1 | machine 
2 | phone 
3 | system 
4 | feature 
5 | telephone 

this thread,你會發現一個長時間的討論,談論的方式,你必須在設計你的架構的佈局,以及如何提示[R檢索您的數據。

+0

無論表看,謝謝你的建議。但我認爲你的查詢對我更有幫助,它只會返回機器記錄。 – Kamlesh

+0

你可以隨心所欲地改變它;你可以用任何詞來替換'machine'。 –

+0

@Kamlesh ..請檢查我的答案中的更新。 –

1

首先你需要把這兩個表數據inti一個,然後給出條件。

Select word from(
SELECT id,word FROM PrimaryWords 
Union all 
Select primaryid,word from AlternativeWords a 
) where id in (select id from primarywords where word='yoursearchketword' 
Union 
Select primaryid from AlternativeWords where word='yoursearchketword') 

更新答案按你的產品表

現在您需要交叉加入產品表,因爲它們之間沒有任何關係。

還有一件事是你必須在這裏使用像運算符來比較你想要的結果與prouct表名字段。在這裏我已經給出了一個小想法如何做到這一點,但你可以很容易地改善。

Select a.word,b.name from 
    (Select word from(
    SELECT id,word FROM PrimaryWords 
    Union all 
    Select primaryid,word from AlternativeWords a 
    ) where id in (select id from primarywords where word='yoursearchketword' 
    Union 
    Select primaryid from AlternativeWords where word='yoursearchketword')) a, product b 
Where a.word LIKE CONCAT('%',name, '%'); 
+0

你可以在這個場景中設置這個產品表嗎?「扭曲是,當用戶在產品表中搜索」機器「時,顯示帶有表格名稱的產品的結果具有」機器「或」系統「或」功能「,如果搜索使用「系統」或「功能」,然後顯示「機器」或「系統」或「功能」或「副」的結果。 – Kamlesh

+0

除了這兩張桌子之外,你還有一桌嗎? – Rams

+0

在產品表中哪一列會搜索'機器'這個詞 – Rams