我正在嘗試使用IN
函數(在我的php腳本中)例如MySQL,替代使用IN將會引發第一個值?
WHERE Keywords.Word IN ('$search[0]','$search[1]',...)
但是,我使用的第一個單詞在數據庫中是唯一的,第二個單詞是一個非常流行的單詞。它沒有顯示任何結果的第一個字。最後我限制了100個。
理想情況下,我不想使用AND
,因爲這會限制結果,所以OR
似乎是最好的,我只是感到驚訝,它並沒有將第一個值比其他值高。
我該怎麼辦?
我正在嘗試使用IN
函數(在我的php腳本中)例如MySQL,替代使用IN將會引發第一個值?
WHERE Keywords.Word IN ('$search[0]','$search[1]',...)
但是,我使用的第一個單詞在數據庫中是唯一的,第二個單詞是一個非常流行的單詞。它沒有顯示任何結果的第一個字。最後我限制了100個。
理想情況下,我不想使用AND
,因爲這會限制結果,所以OR
似乎是最好的,我只是感到驚訝,它並沒有將第一個值比其他值高。
我該怎麼辦?
的複雜性與LIMIT子句合併。您希望它表現良好,因此您需要從任何分支獲得至多100個。通過使用CASE/IF對所有行進行排名的幼稚方法將導致全表掃描。
SELECT * FROM (
SELECT 1 as prec, column-list FROM table-list
WHERE Keywords.Word = '$search[0]'
LIMIT 100) A
UNION ALL
SELECT * FROM (
SELECT 2 as prec, column-list FROM table-list
WHERE Keywords.Word = '$search[1]'
LIMIT 100) B
UNION ALL
SELECT * FROM (
SELECT 3 as prec, column-list FROM table-list
WHERE Keywords.Word = '$search[2]'
LIMIT 100) C
ORDER BY prec
LIMIT 100;
這對於大型表格可能會更好。
+ 1.它總是很高興閱讀你的帖子:) – 2011-03-14 10:52:33
select *,if(word = 'some word',1,2) as relevance
from table
where word in ('some word','other word','another')
order by relevance
它看起來像你可以只排序根據自己的喜好:
SELECT Keywords.KeywordsId, Keywords.Word
FROM Keywords
WHERE Keywords.Word IN ('foo', 'bar')
ORDER BY
CASE Keywords.Word
WHEN 'foo' THEN 1
ELSE 2
END,
Keywords.Word -- Or any other criteria
LIMIT 100
ORDER BY CASE Keywords.Word
WHEN '$search[0]' THEN 1
WHEN '$search[1]' THEN 2
-- ...
ELSE 999
END
看起來你需要FIND_IN_SET
函數。
WHERE Keywords.Word IN ('$search[0]','$search[1]',...)
ORDER BY FIND_IN_SET(Keywords.Word,'$search[0],$search[1],...')
雖然存在一個限制,您的搜索字詞不能包含逗號。如果這是你可以忍受的限制,那麼這就是要走的路。
順便說一句,我希望'$ search'內的每個項目在被注入SQL代碼之前都能正確轉義。 – 2011-03-14 10:47:56