2013-05-06 103 views
1

我希望能夠查詢多個語句,當我有一個表連接兩個其他表的ID。查詢MySQL中的多個條件

我的三個表

destination: 
id_destination, name_destination 

keyword: 
id_keyword, name_keyword 

destination_keyword: 
id_keyword, id_destination 

其中最後一個從destination-和關鍵字表連接的ID,以目的地關鍵字相關聯。

查詢來獲取基於關鍵字的目標則看起來像

SELECT destination.name_destination FROM destination 
      NATURAL JOIN destination_keyword 
      NATURAL JOIN keyword 
      WHERE keyword.name_keyword like _keyword_ 

是否可以查詢多個關鍵字,比方說,我想獲得相匹配的關鍵字的全部或部分的目的地列表sunny, ocean, fishing和按匹配數量排序。我將如何前進?我應該重組桌子嗎?我對SQL很陌生,非常喜歡一些輸入。

+0

「name_keyword」的值是單個單詞「sunny」嗎? – Bohemian 2013-05-06 19:05:13

+0

他們是單個單詞,是的。 – Martol1ni 2013-05-06 19:18:06

回答

1

令你的表連接開始keyword和目的地加入時間的使用數量計數:

select 
    d.id_destination, 
    d.name_destination, 
    count(d.id_destination) as matches 
from keyword k 
join destination_keyword dk on dk.keyword = k.keyword 
join destination d on d.id_destination = dk.id_destination 
where name_keyword in ('sunny', 'ocean', 'fishing') 
group by 1, 2 
order by 3 desc 

這個查詢假設name_keyword數值是單個單詞,如「陽光燦爛」。


使用自然連接是不是一個好主意,因爲如果表結構改變使得兩個自然連接表得到改變,以具有相同的名稱添加,突然你的查詢將停止工作列。此外,通過明確聲明連接條件,代碼的讀者將立即理解表是如何表示的,並且可以根據需要修改它以添加非關鍵條件。

要求只有關鍵列共享同一個名字也是限制性的,因爲它需要像「name_keyword」而不是簡單的「name」這樣的非自然列名 - 後綴「_keyword」是多餘的,並且不會添加任何值, 擁有,因爲您使用的是自然連接。

自然連接節約幾乎沒有任何類型(通常導致打字在所有),並強加給連接類型和名稱限制和易碎。

他們應該避免。

+0

謝謝,這很好。我不確定考慮我是從多行中提取並比較它們。是否有可能顯示單獨的比賽?同時選擇匹配的關鍵字,比如'sunny','ocean'。 - 「name_keyword」是一個單詞,是的。 – Martol1ni 2013-05-06 19:17:23

0

您可以嘗試類似如下:

SELECT dest.name_destination, count(*) FROM destination dest, destination_keyword dest_key, keyword key 
WHERE key.id_keyword = dest_key.id_keyword 
AND dest_key.id_destination = dest.id_destination 
AND key.name_keyword IN ('sunny', 'ocean', 'fishing') 
GROUP BY dest.name_destination 
ORDER BY count(*), dest.name_destination 

沒有測試它,但如果它是不正確的,應該表現出你完成它的方式。

+0

我認爲OP希望做一個LIKE匹配。所以你的解決方案將無法工作,因爲LIKE不適用於IN。 – Nabheet 2013-05-06 18:32:08

+0

@NabheetSandhu那麼,檢查他標記爲正確的答案似乎他並不需要LIKE。 – drewich 2013-05-06 21:35:41

+0

drewich,你是對的。道歉! – Nabheet 2013-05-08 21:09:18

0

你可以做多個LIKE語句:

Column LIKE 'value1' OR Column LIKE 'value2' OR ... 

或者你可以做一個正則表達式匹配:

Column LIKE 'something|somtthing|whatever' 

通過匹配的數量訣竅排序與理解GROUP BY做子句和ORDER BY子句。你要麼爲一切計數,要麼你希望每個東西計數一次。因此,對於第一種情況,您只需使用COUNT函數。在第二種情況下,您使用GROUP BY子句對要計算的某些/某些類別進行「分組」。 ORDER BY應該非常簡單。

我認爲根據您提供的表格結構的信息是好的。

希望這會有所幫助。

免責聲明:我的語法不準確。