2011-03-14 20 views
1

我正在嘗試使用IN函數(在我的php腳本中)例如MySQL,替代使用IN將會引發第一個值?

WHERE Keywords.Word IN ('$search[0]','$search[1]',...) 

但是,我使用的第一個單詞在數據庫中是唯一的,第二個單詞是一個非常流行的單詞。它沒有顯示任何結果的第一個字。最後我限制了100個。

理想情況下,我不想使用AND,因爲這會限制結果,所以OR似乎是最好的,我只是感到驚訝,它並沒有將第一個值比其他值高。

我該怎麼辦?

+1

順便說一句,我希望'$ search'內的每個項目在被注入SQL代碼之前都能正確轉義。 – 2011-03-14 10:47:56

回答

1

的複雜性與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; 

這對於大型表格可能會更好。

+0

+ 1.它總是很高興閱讀你的帖子:) – 2011-03-14 10:52:33

1
select *,if(word = 'some word',1,2) as relevance 
from table 
where word in ('some word','other word','another') 
order by relevance 
1

它看起來像你可以只排序根據自己的喜好:

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 
1
ORDER BY CASE Keywords.Word 
WHEN '$search[0]' THEN 1 
WHEN '$search[1]' THEN 2 
-- ... 
ELSE 999 
END 
0

看起來你需要FIND_IN_SET函數。

WHERE Keywords.Word IN ('$search[0]','$search[1]',...) 
ORDER BY FIND_IN_SET(Keywords.Word,'$search[0],$search[1],...') 

雖然存在一個限制,您的搜索字詞不能包含逗號。如果這是你可以忍受的限制,那麼這就是要走的路。

+0

這似乎並沒有做你說什麼,我的第一個字沒有出現。 ? – Jules 2011-03-14 11:36:16

+0

@Jules檢查[文檔](http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_find-in-set)以確保您正確使用該功能。 ..如果它沒有做文檔說的話,那麼你應該提交一份錯誤報告! – awm 2011-03-14 12:15:56