【问题标题】:MySQL ORDER BY keyword matchMySQL ORDER BY 关键字匹配
【发布时间】:2011-01-25 19:34:33
【问题描述】:

我有一张这样的桌子:

mysql> 从测试中选择 *; +--------------+ |姓名 | +--------------+ |一个 | |二 | |三 | |井字游戏 | |井字游戏 | +--------------+ 5 行一组(0.00 秒)

我想查询它,以便获得所有行,但这些行首先匹配某个关键字。这是我到目前为止得到的:

mysql> select * from test order by instr(name, 'tac') desc; +--------------+ |姓名 | +--------------+ |井字游戏 | |井字游戏 | |一个 | |二 | |三 | +--------------+ 一组 5 行(0.01 秒)

唯一的问题是我更愿意按照关键字出现在字段开头的距离来对匹配的行进行排序。因为 instr() 返回 0 表示不匹配,所以当我 ORDER BY INSTR(name, 'tac') ASC 时首先出现不匹配的行。我一直无法找到解决这个问题的方法。

我需要 MySQL 来这样订购

1
2
3
4
0
0
0

或者我需要 instr() 返回 NULL 而不是 0。

【问题讨论】:

    标签: sql mysql search


    【解决方案1】:

    您需要按 2 列排序,第一列表示是否匹配(使 0 到底部)

    select *
    from test
    order by
        CASE WHEN instr(name, 'tac') = 0 then 1 else 0 end,
        instr(name, 'tac') desc;
    

    关于使用 NULL 的说明,它们位于查询的顶部,因此您无法将 0 转换为 null。

    select a
    from (select 1 as a union all select null) b
    order by a
    

    结果

    (NULL)
    1
    

    【讨论】:

    • 效果很好,谢谢!我以前从未在 MySQL 中使用过 CASE 语句,或者任何有条件的 sql 语句。我认为这可能比查询后在 PHP 中对结果进行排序要快。
    【解决方案2】:

    使用IF,你将能够做你想做的事:当没有匹配时返回一个不为零的值:

    select * from test order by IF(instr(name, 'toc'), instr(name, 'toc'), 65535) desc;
    

    【讨论】:

    • 感谢您的回复。我接受了cyberkiwi建议的案例陈述,但我相信你的案例陈述会很好用。
    【解决方案3】:

    如果你喜欢简洁:

    select *
    from test
    order by
        instr(name, 'tac') = 0,
        instr(name, 'tac') desc;
    

    【讨论】:

    • 所以我猜 instr(name, 'tac') = 0 会解析为 true 或 false 并且 false 在升序时首先排序?
    【解决方案4】:
    ORDER BY FIELD(culumn_name,'keyword_3', 'keyword_2','keyword_1', 'keyword_4')
    

    结果将是 关键字_3,关键字_2,关键字_1,关键字_4

    【讨论】:

      猜你喜欢
      • 2012-04-05
      • 2012-06-24
      • 2015-03-03
      • 2011-12-22
      • 2016-04-24
      • 1970-01-01
      • 1970-01-01
      • 2015-02-26
      • 1970-01-01
      相关资源
      最近更新 更多