我需要一些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