我需要一些SELECT
查詢的邏輯幫助,並希望有人能給我一個比我有更好的主意。MySql SELECT查詢跨多個字段的多個關鍵字
我有一個表是這樣的:
+---------+----------+---------+-----------+
| id | model | variant | category |
+---------+----------+---------+-----------+
| 1 | round | black | fruit |
| 2 | square | white | vegetable |
| 3 | flat | red | meat |
| 4 | round | black | meat |
+---------+----------+---------+-----------+
用戶將被允許通過輸入一個或多個關鍵詞上做此表的搜索。
我現在的查詢對所有輸入的關鍵字AGAINST
做了MATCH
每個字段,並且我得到與任何關鍵字匹配的行。 因此,如果輸入的是「圓肉」,結果將是行1,3和4:
SELECT v.*, vt.color
FROM tbl_items
AS v
LEFT JOIN tbl_apple
AS vt
ON v.id = vt.v_id
WHERE (
MATCH (v.model) AGAINST ('keyword1 keyword2' IN BOOLEAN MODE)
OR MATCH (v.variant) AGAINST ('keyword1 keyword2' IN BOOLEAN MODE)
OR MATCH (v.category) AGAINST ('keyword1 keyword2 ' IN BOOLEAN MODE))
AND v.type = 4
不過,我只需要返回包含所有關鍵字的行。關鍵字可能包含在三列中的任何一列中。
因此,如果用戶輸入「圓肉」,只返回第4行。
我現在的想法很簡單,可能不是很好(我希望多個關鍵字一些性能問題):
SELECT v.*, vt.color
FROM tbl_items
AS v
LEFT JOIN tbl_apple
AS vt
ON v.id = vt.v_id
WHERE
(
(v.model = 'keyword1'
OR v.variant = 'keyword1'
OR v.category = 'keyword1'
)
AND
(v.model = 'keyword2'
OR v.variant = 'keyword2'
OR v.category = 'keyword2'
)
)
AND v.type = 4
有沒有更好的辦法做到這一點?
像這樣複雜的關鍵字搜索的要求,我建議使用像一個專門的搜索工具獅身人面像或Lucene - 它會爲你的系統增加一點複雜性,但是在性能和靈活性方面的回報將是巨大的。 – Spudley
Sphinx是一個很好的建議,謝謝。但是,我正在嘗試搜索功能整合只是整個搜索的一小部分(已經可用),所以我需要更簡單一些。否則,如果此類搜索是爲了實現核心功能,相當有效的建議。 – user3132858