按字符串在文本字段中的位置(索引)对mySQL结果进行排序

bxjv4tth  于 12个月前  发布在  Mysql
关注(0)|答案(2)|浏览(98)

很抱歉,如果这是重复的问题,但我找不到任何有用的东西在这里。
所以,我尝试做的是,按照title字段中查询字符串的位置对mySQL语句的结果进行排序。我试着用WAR函数来做这件事,这有点起作用(即使第一个结果是错误的,因为它有一个元音变音-也许你也有一个解释=加分)。我的语句看起来像这样(在这种情况下,查询字符串是'all'):

SELECT title, translation, INSTR(title, 'all') as posititon
FROM `dictionary` 
WHERE title LIKE '%all%' 
ORDER BY posititon

结果如下所示:

到目前为止,一切顺利。但我也希望有结果匹配的字段中的查询字符串“查询”。所以当我在WHERE子句中添加OR translation LIKE '%all%'时,我得到了一个完全不同的结果:

SELECT title, translation, INSTR(title, 'all') as posititon
FROM `dictionary` 
WHERE (title LIKE '%all%' OR translation LIKE '%all%')
ORDER BY posititon

测试结果:

因此,我的目标是根据查询字符串在字段“title”中的位置对结果PRIMARY进行排序,并根据查询字符串在字段“addition”中的位置对结果SECONDARY进行排序。
你能帮我吗?

6yt4nkrj

6yt4nkrj1#

我认为regexp_like可能有助于获得职位:

with cte as (
   select 'Mistkäll' as title 
   union all 
   select 'all' 
   union all
   select 'cow')
select 
   title, 
   regexp_instr(title,'[aä]ll')  regexp1
from cte
order by regexp1;

产出:
| 标题|regexp1|
| --|--|
| 牛| 0 |
| 所有| 1 |
| 米斯凯尔| 6 |
注意:当然,你需要用所有可能的值来扩展正则表达式([aä]),比如áà等。

zour9fqk

zour9fqk2#

这并不涉及Luuk的回答中提到的口音敏感性问题。
因为当指针没有找到时,REGEXP_REREXP_REGEXP_REREREREXP_REGEXP_REXP_REREREXP_REXP_
这里有一个方法:

WITH dictionary (title, translation) AS (
    VALUES
        ROW('Mistkäll', 'Mistkerl'),
        ROW('all', 'alle, aufgerbraucht - '),
        ROW('Toa', 'Tor (Fußball)'),
        ROW('ball', 'something'),
        ROW('something', 'ball'),
        ROW('something', 'all'),
        ROW('small', 'something')
)
SELECT
    title,
    translation,
    NULLIF(INSTR(title, 'all'), 0) as ti_pos,
    NULLIF(INSTR(translation, 'all'), 0) as tr_pos
FROM `dictionary` 
WHERE (title LIKE '%all%' OR translation LIKE '%all%')
ORDER BY -ti_pos DESC, -tr_pos DESC;

-ti_pos DESCti_pos ASC相同,但NULL移到了末尾。
输出:
| 标题|翻译|ti_pos| tr_pos|
| --|--|--|--|
| 所有|alle,aufgerbraucht -| 1 | 1 |
| 球|东西| 2 ||
| 小|东西| 3 ||
| 东西|所有|| 1 |
| 东西|球|| 2 |
| Toa| Tor(Fußball)|| 10 |
| 米斯凯尔|米斯凯尔|||
或者是意图更明显的东西:

SELECT
    title,
    translation,
    INSTR(title, 'all') as ti_pos,
    INSTR(translation, 'all') as tr_pos
FROM `dictionary` 
WHERE (title LIKE '%all%' OR translation LIKE '%all%')
ORDER BY IF(ti_pos = 0, 99999999, ti_pos), IF(tr_pos = 0, 99999999, tr_pos);

相关问题