2013-02-13 102 views
2

所以我決定在MySQL搜索使用,使...MySQL的LIKE ...結果優先排序

SELECT * 
FROM items AS i 
INNER JOIN tags AS t ON i.id = t.item_id 
WHERE item LIKE ('%s%' OR '%s2%' ... OR '%sn%') 
    AND tag LIKE ('%s%' OR '%s2%' ... OR '%sn%'); 

這不是全文,產品VARCHAR(32),標籤爲VARCHAR(16)。

我有問題排序結果...當涉及到一個搜索字符串時,我可以得到優先順序,但是當我有更多的時候,它有一點點廢話,我最終(搜索字符串數)+7查詢和我感覺真的很髒使用它。我覺得比真正使用它的狗屎洗澡更髒......這就是它看起來怎麼樣?

SELECT 
    t1.item_id, t1.item, t1.created, t1.owner, t1.type, t1.fld, t2.tag 
FROM 
    items AS t1 
INNER JOIN 
    tagged AS t2 ON t1.item_id = t2.item_id 
WHERE 
    (item LIKE '%red%' OR '%apple%') 
GROUP BY 
    item_id 
ORDER BY 
    CASE 
     WHEN item = 'red' 
     THEN 0 
     WHEN item = 'apple' 
     THEN 1 
     WHEN (item LIKE 'red%' OR 'apple%') 
     THEN 2 
     WHEN (item LIKE '%red%' AND '%apple%') 
     AND (tag LIKE '%red%' AND '%apple%') 
     THEN 3 
     WHEN (item LIKE '%red%' AND '%apple%') 
     AND (tag LIKE '%red%' OR '%apple%') 
     THEN 4 
     WHEN (item LIKE '%red%' AND '%apple%') 
     THEN 5 
     WHEN (item LIKE '%red%' OR '%apple%') 
     AND (tag LIKE '%red%' OR '%apple%') 
     THEN 6 
     WHEN (item LIKE '%red%' OR '%apple%') 
     THEN 7 
     WHEN (tag LIKE '%red%' OR '%apple%') 
     THEN 8 
     ELSE 9 
    END ASC , 
    created DESC 
LIMIT 0 , 30 

是啊,就這麼髒,我怎麼能剪下來?我實際上使用PHP腳本從搜索字符串中生成該查詢。這個查詢只是慢了一點,沒有排序的查詢,我們沒有得到高負載,但它感覺對我來說很髒。有沒有更優雅的方式來做到這一點?

+1

值得一提的是,一個領先的通配符搜索是關於您可以要求SQL做的最慢的事情。對於特別是這樣的東西,你最好使用像Sphinx這樣的專用搜索工具。 – SDC 2013-02-13 13:04:34

+0

不能這樣做,webshosting不支持:/ – user2044390 2013-02-13 13:33:06

+1

好吧。那麼,只要你知道諸如'%xyz%'這樣的查詢的性能影響。數據庫必須讀取表中的每條記錄才能找到匹配的記錄,因此如果您有大量數據(甚至是中等數量),這會嚴重降低性能。 「WHERE」條款中的所有其他模式匹配也會影響您的表現,不過初始閱讀將成爲主要問題。 – SDC 2013-02-13 13:44:31

回答

0

我寧願推箱子...何時選擇條款。我的查詢將如下所示:

SELECT field1, field2, 
case 
when field1 like 's1%' then 1 
when field1 like 's2%' then 2 
end as ordering_field 
from table_name 
group by field1 
order by ordering_field