2010-09-08 109 views
0

我正在開發網站的搜索功能。我有一個名爲關鍵字的表格,有兩個字段ID和關鍵字。我有兩個單獨的搜索查詢AND和OR。問題在於AND查詢。它沒有返回我期望的結果。我沒有從SQL查詢中獲得預期結果

印刷SQL是:

SELECT COUNT(DISTINCT tg_id) 
FROM tg_keywords 
WHERE tg_keyword='keyword_1' 
    AND tg_keyword='keyword_2' 

返回的計數爲0,而如果我代替或執行相同的SQL和返回的計數爲1。我期望的計數爲1在兩種情況下,我需要這樣做,因爲AND結果將優先於OR結果。

任何意見將不勝感激。

感謝 阿奇

+1

這個條件'場= str1和場= str1!= str2'永遠不會發生。因此,你總會得到0的結果。 – NullUserException 2010-09-08 23:35:35

回答

1

查詢不能工作,因爲你有一個條件始終設置爲false所以沒有記錄將被選中!

tg_keyword='keyword_1' AND tg_keyword='keyword_2' 

你想做什麼?你能發表這張表的專欄嗎?

+0

我有一個包含多個具有相同ID的關鍵字的表格。如何獲得同一個ID的多個關鍵字進行比較,因爲搜索結果需要基於搜索陣列中有多少關鍵字與每個唯一ID的關鍵字表中的關鍵字匹配。有任何想法嗎? – archiebald 2010-09-08 23:33:29

+0

@archie請編輯您的問題,以包括此澄清。 – 2010-09-08 23:47:02

2

我不知道你的表是什麼樣子,以及它們是如何相互關聯的,但是這個查詢沒有任何意義。你在返回關鍵字是同一件事和另一件事情的行?這不可能。

你可能有另一個鏈接到關鍵字的表?您應該使用該搜索進行搜索,並使用連接搜索這兩個關鍵字。如果你能告訴我們你的桌子是什麼樣的,我們可以給你一個更準確的答案。

編輯:根據你在下面評論中寫道(請編輯您的問題!),你可能在尋找這樣的:

SELECT COUNT(DISTINCT tg_id) 
FROM tg_keywords AS kw1, tg_keywords AS kw2 
WHERE kw1.tg_id = kw2.tg_id 
    AND kw1.tg_keyword='keyword_1' 
    AND kw2.tg_keyword='keyword_2' 
1
tg_keyword='keyword_1' AND tg_keyword='keyword_2' 

邏輯上,這不可能是真的,直到永遠。它不能兼而有之。你的意思是這樣的:

SELECT * FROM keywords 
WHERE tg_keyword LIKE '%keyword_1%' OR tg_keyword LIKE '%keyword_2%' 
ORDER BY tg_keyword LIKE '%keyword_1%' + tg_keyword LIKE '%keyword_2%' DESC; 
+0

看起來不錯,我現在就試試看。我會讓你知道我如何繼續。謝謝。 – archiebald 2010-09-08 23:36:09

+0

在另一條評論中,他表示他將關鍵字分散在具有相同ID的多行上。如果每行都包含所有關鍵字,則您的代碼有效。 – EboMike 2010-09-09 00:16:05

+0

是的,在給出這個答案之前的評論(我給你的是一個猜測)。 – Wrikken 2010-09-09 08:46:13

2

它總是會返回0,除非keyword_1 = keyword_2。 tg_keyword只能有一個值,當你說AND時,你要求兩個條件都是真的。

從邏輯上講,這同樣是問「我有幾個朋友的名字是'JACK'和'JILL'」?沒有人叫JACK和JI​​LL。

+4

至少,不是來自同一組朋友... – 2010-09-08 23:31:18

+0

@djacobson眨眼;) – NullUserException 2010-09-08 23:35:06

1

我認爲你需要將tg_keywords加入自己。試着用東西打周圍像

select * 
from tg_keywords k1 
join tg_keywords k2 on k1.tg_id = k2.tg_id 
where k1.tg_keyword = 'keyword_1' and k2.tg_keyword = 'keyword_2' 
1

基於業務方案的澄清:

我有具有相同ID的多個關鍵字的表。如何獲得同一個ID的多個關鍵字進行比較,因爲搜索結果需要基於搜索陣列中有多少關鍵字與每個唯一ID的關鍵字表中的關鍵字匹配。有任何想法嗎?

我假定你正在尋找返回基於的排名所選關鍵字有多少與結果匹配的搜索結果?換句話說,多個關鍵字共享可能的搜索結果的ID的ID字段是多少?

如果是這樣,假設你在表單{k1, k2, k3, k4}的關鍵字數組傳遞,你可能會使用這樣的查詢:

SELECT ID, COUNT(ID) AS ResultRank FROM tg_keywords WHERE tg_keyword IN (k1, k2, k3, k4) GROUP BY ID ORDER BY ResultRank DESC

此示例還假定一個給定的關鍵字可能會出現在表的多個與不同的 ID(因爲關鍵字可能適用於多個搜索結果)。該查詢將根據它們隨任何所選關鍵字出現的次數以降序返回ID列表。在給出的例子,對於給定ID的最高級別應該是4,這意味着所有的關鍵字應用於結果與ID ...

0

嘗試:

SELECT tg_id 
FROM tg_keywords 
WHERE tg_keyword in ('keyword_1','keyword_2') 
GROUP BY tg_id 
HAVING COUNT(DISTINCT tg_keyword) = 2