Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL-按列和关键字在结果中的位置搜索行和顺序_Mysql - Fatal编程技术网

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)
  • “说明”列为“中间文本”
用户执行“关键字\u 1关键字\u 2关键字\u 3”或“关键字\u 1关键字\u 2”或“关键字\u 1”搜索,我希望通过符合以下条件的查询获得结果:

  • 它应该首先返回类型为0的行
  • 它应该返回包含title和/或description中所有关键字的行(title或description(或两者)应该包含用户输入的所有关键字)
  • 它应该首先返回两列(title和/或description)中关键字位置最左边的行(表中存储的字符串的行号)
  • 对于每个关键字,它应该只匹配整个单词(我不希望结果包含关键字\u 1和其他字符)
  • 更新如果
    类型
    =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