【问题标题】:MySQL - ORDER BY values within IN()MySQL - IN() 中的 ORDER BY 值
【发布时间】:2010-10-31 19:30:06
【问题描述】:

我希望按照输入 IN() 函数的顺序对以下查询中返回的项目进行排序。

输入:

SELECT id, name FROM mytable WHERE name IN ('B', 'A', 'D', 'E', 'C');

输出:

|   id   |   name  |
^--------^---------^
|   5    |   B     |
|   6    |   B     |
|   1    |   D     |
|   15   |   E     |
|   17   |   E     |
|   9    |   C     |
|   18   |   C     |

有什么想法吗?

【问题讨论】:

    标签: mysql sql-order-by where-clause


    【解决方案1】:

    只需使用

    order by INSTR( ',B,C,D,A,' ,  concat(',' , `field`, ',' ) )
    

    避免这种情况

     INSTR('1,2,3,11' ,`field`) 
    

    将以无序的结果行结束:1 和 11 交替

    【讨论】:

      【解决方案2】:

      这可能对某人有帮助(p_CustomerId 在 SP 中传递):

      SELECT CompanyAccountId, CompanyName
      FROM account
      LEFT JOIN customer where CompanyAccountId = customer.AccountId
      GROUP BY CompanyAccountId
      ORDER BY CASE WHEN CompanyAccountId IN (SELECT AccountId 
                                                FROM customer
                                                WHERE customerid= p_CustomerId) 
                       THEN 0
                       ELSE 1
                END, CompanyName;
      

      说明:我想显示帐户列表。在这里,我在 sp 中传递了一个客户 ID。现在它将列出与该客户关联的帐户的帐户名称显示在顶部,然后按字母顺序显示其他帐户。

      【讨论】:

        【解决方案3】:

        这里的另一个选择: http://dev.mysql.com/doc/refman/5.0/en/sorting-rows.html

        select * 
        from tablename 
        order by priority='High' DESC, priority='Medium' DESC, priority='Low" DESC;
        

        所以在你的情况下(未经测试)将是

        SELECT id, name
        FROM mytable
        WHERE name IN ('B', 'A', 'D', 'E', 'C')
        ORDER BY name = 'B', name = 'A', name = 'D', name =  'E', name = 'C';
        

        取决于你在做什么,我发现它有点古怪,但在玩了一会儿之后总能让它工作。

        【讨论】:

        • 这可能比使用 field() 函数作为建议的另一个答案更好,因为使用 field() 将排除索引的使用,但它有机会使用此方法使用索引(不确定效果如何不过它可能会使用索引)
        • 这很好,但我需要在每个部分之后指定DESC 作为方向。相等性检查的值为1,其余的都是0,所以我需要通过检查的那个,首先出现。
        • 我们发现这种方法比使用FIELD()很多。我们可能使用不当或数据集太大(约 22,000 条返回记录),但请确保您自己进行基准测试。
        【解决方案4】:
        SELECT id, name
        FROM mytable
        WHERE name IN ('B', 'A', 'D', 'E', 'C')
        ORDER BY FIELD(name, 'B', 'A', 'D', 'E', 'C')
        

        FIELD 函数返回第一个字符串在剩余字符串列表中的位置。

        但是,拥有一个代表您的排序顺序的索引列,然后按此列排序,在性能方面要好得多。

        【讨论】:

        • @Vladimir - 是的,它是特定于 MySQL 的。问题有mysql标签。
        • 很好,替换了数据库切换后Oracle的“解码”功能。
        • 小心。任何未知属性值(不在列表中)将优先于已知值,即FIELD(letter, 'A', 'C'),列表将首先返回带有 B 字母的条目(假设一组记录具有 A | B | C 值)。为避免这种情况,请反转列表并使用 DESC,即FIELD(letter, 'C', 'A') DESC
        • 我如何在 SQL Server 中实现这一点。
        【解决方案5】:

        试试类似的东西

        ... ORDER BY (CASE NAME WHEN 'B' THEN 0 WHEN 'A' THEN 1 WHEN ...
        

        【讨论】:

          【解决方案6】:

          您需要在表中指定另一列(数字),在其中指定排序顺序。 IN 子句不能这样工作。

          B - 1
          A - 2
          D - 3
          E - 4
          C - 5
          

          【讨论】:

          • 所需的订单可能是每个查询。
          猜你喜欢
          • 2010-11-22
          • 1970-01-01
          • 2016-04-03
          • 2011-10-12
          • 2012-04-05
          • 1970-01-01
          相关资源
          最近更新 更多