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腳本從搜索字符串中生成該查詢。這個查詢只是慢了一點,沒有排序的查詢,我們沒有得到高負載,但它感覺對我來說很髒。有沒有更優雅的方式來做到這一點?
值得一提的是,一個領先的通配符搜索是關於您可以要求SQL做的最慢的事情。對於特別是這樣的東西,你最好使用像Sphinx這樣的專用搜索工具。 – SDC 2013-02-13 13:04:34
不能這樣做,webshosting不支持:/ – user2044390 2013-02-13 13:33:06
好吧。那麼,只要你知道諸如'%xyz%'這樣的查詢的性能影響。數據庫必須讀取表中的每條記錄才能找到匹配的記錄,因此如果您有大量數據(甚至是中等數量),這會嚴重降低性能。 「WHERE」條款中的所有其他模式匹配也會影響您的表現,不過初始閱讀將成爲主要問題。 – SDC 2013-02-13 13:44:31