我需要一些关于SELECT
查询逻辑的帮助,希望有人能给我一个比我更好的主意。
我有一张这样的桌子:
+---------+----------+---------+-----------+
| id | model | variant | category |
+---------+----------+---------+-----------+
| 1 | round | black | fruit |
| 2 | square | white | vegetable |
| 3 | flat | red | meat |
| 4 | round | black | meat |
+---------+----------+---------+-----------+
用户将被允许通过输入一个或多个关键字在此表上进行搜索。
我现在拥有的查询MATCH
对每个字段的所有输入关键字执行一个查询AGAINST
,并且我得到与任何关键字匹配的行。因此,如果输入是“圆肉”,则结果将是第 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
有更好的方法吗?