MySQL-按列和关键字在结果中的位置搜索行和顺序
我又一次碰到了一个问题,我需要你的帮助来解决它。我的背景如下: 我有一个存储记录的表,其基本结构如下所示(还有一些其他列,但在本期中使用了这些列): ……等等MySQL-按列和关键字在结果中的位置搜索行和顺序,mysql,Mysql,我又一次碰到了一个问题,我需要你的帮助来解决它。我的背景如下: 我有一个存储记录的表,其基本结构如下所示(还有一些其他列,但在本期中使用了这些列): ……等等 ID列是自动递增的 类型列为int(1),只有两个可能的值:0或1 标题列为varchar(255) “说明”列为“中间文本” 用户执行“关键字\u 1关键字\u 2关键字\u 3”或“关键字\u 1关键字\u 2”或“关键字\u 1”搜索,我希望通过符合以下条件的查询获得结果: 它应该首先返回类型为0的行 它应该返回包含title和
- ID列是自动递增的
- 类型列为int(1),只有两个可能的值:0或1
- 标题列为varchar(255)
- “说明”列为“中间文本”
类型
=0,则仅在标题
中搜索,否则在标题
或说明
select * from table
where title and / or description contains all the keywords
and keywords are most to the beginig of title and or description
order by type asc and by position of keywords in title and / or description
当前,我的查询如下所示:
SELECT *
FROM table
WHERE table.`type` IN ('0','1')
AND table.`approved` = 1
AND table.`trash` = 0
AND ((table.`type` = 0
AND (match(table.`title`) against ('+keyword_1' IN BOOLEAN MODE)
AND match(table.`title`) against ('+keyword_2' IN BOOLEAN MODE)
AND match(table.`title`) against ('+keyword_3' IN BOOLEAN MODE))
OR table.`title` REGEXP '\bkeyword_1 keyword_2 keyword_3\b')
OR (table.`type` = 1
AND ((match(table.`title`) against ('+keyword_1' IN BOOLEAN MODE)
AND match(table.`title`) against ('+keyword_2' IN BOOLEAN MODE)
AND match(table.`title`) against ('+keyword_3' IN BOOLEAN MODE))
OR (match(table.`description`) against ('+keyword_1' IN BOOLEAN MODE)
AND match(table.`description`) against ('+keyword_2' IN BOOLEAN MODE)
AND match(table.`description`) against ('+keyword_3' IN BOOLEAN MODE)))
OR (table.`title` REGEXP '\bkeyword_1 keyword_2 keyword_3\b'
OR table.`description` REGEXP '\bkeyword_1 keyword_2 keyword_3\b'))
OR (table.`type` = 1
AND ((table.`title` REGEXP '\bkeyword_1\b'
OR table.`title` REGEXP '\bkeyword_2\b'
OR table.`title` REGEXP '\bkeyword_3\b')
AND (table.`description` REGEXP '\bkeyword_1\b'
AND table.`description` REGEXP '\bkeyword_2\b'
AND table.`description` REGEXP '\bkeyword_3\b'))))
ORDER BY table.`type` ASC,
CASE
WHEN table.`type` = 0 THEN INSTR(table.`title`, 'keyword_1 keyword_2 keyword_3')
WHEN table.`type` = 1 THEN INSTR(concat(table.`title`, table.`description`), 'keyword_1 keyword_2 keyword_3')
END ASC
LIMIT 0,20
但我没有得到我想要的。谁能帮我解决这个问题
提前感谢您的时间和帮助 您使用的是什么版本的MySQL?您不能在8.0之前的正则表达式中使用
\b
。@Bramar服务器版本:5.5.60-MariaDB-MariaDB服务器然后您需要使用[:]
进行单词边界。在MariaDB 10.0.5中添加了PCRE。@Barmar我更改了regexp,结果与您使用的MySQL版本相同?您不能在8.0之前的正则表达式中使用\b
。@Bramar服务器版本:5.5.60-MariaDB-MariaDB服务器然后您需要对单词边界使用[:]
。在MariaDB 10.0.5中添加了PCRE。@Barmar我更改了regexp,结果相同
SELECT *
FROM table
WHERE table.`type` IN ('0','1')
AND table.`approved` = 1
AND table.`trash` = 0
AND ((table.`type` = 0
AND (match(table.`title`) against ('+keyword_1' IN BOOLEAN MODE)
AND match(table.`title`) against ('+keyword_2' IN BOOLEAN MODE)
AND match(table.`title`) against ('+keyword_3' IN BOOLEAN MODE))
OR table.`title` REGEXP '\bkeyword_1 keyword_2 keyword_3\b')
OR (table.`type` = 1
AND ((match(table.`title`) against ('+keyword_1' IN BOOLEAN MODE)
AND match(table.`title`) against ('+keyword_2' IN BOOLEAN MODE)
AND match(table.`title`) against ('+keyword_3' IN BOOLEAN MODE))
OR (match(table.`description`) against ('+keyword_1' IN BOOLEAN MODE)
AND match(table.`description`) against ('+keyword_2' IN BOOLEAN MODE)
AND match(table.`description`) against ('+keyword_3' IN BOOLEAN MODE)))
OR (table.`title` REGEXP '\bkeyword_1 keyword_2 keyword_3\b'
OR table.`description` REGEXP '\bkeyword_1 keyword_2 keyword_3\b'))
OR (table.`type` = 1
AND ((table.`title` REGEXP '\bkeyword_1\b'
OR table.`title` REGEXP '\bkeyword_2\b'
OR table.`title` REGEXP '\bkeyword_3\b')
AND (table.`description` REGEXP '\bkeyword_1\b'
AND table.`description` REGEXP '\bkeyword_2\b'
AND table.`description` REGEXP '\bkeyword_3\b'))))
ORDER BY table.`type` ASC,
CASE
WHEN table.`type` = 0 THEN INSTR(table.`title`, 'keyword_1 keyword_2 keyword_3')
WHEN table.`type` = 1 THEN INSTR(concat(table.`title`, table.`description`), 'keyword_1 keyword_2 keyword_3')
END ASC
LIMIT 0,20