代码之家  ›  专栏  ›  技术社区  ›  Jürgen Steinblock

从mysql orderd by IN子句中获取结果

  •  2
  • Jürgen Steinblock  · 技术社区  · 14 年前

    我有以下问题

    SELECT * FROM invoice WHERE invoice_id IN (13, 15, 9, 27)
    

    我的结果是:

    invoice_id | invoice_number | ...
    ------------------------------------
    9          | 201006003      |
    13         | 201006020      |
    15         | 201006022      |
    27         | 201006035      |
    

    这是我想要的结果集,但它是按发票id排序的(这是一个自动增量值)。

    现在我希望结果按照我在查询中指定的顺序(13,15,…)。有办法做到吗?

    背景是我有一个绑定到DataGridView的DataTable。用户可以过滤和排序结果,但如果他想打印结果,我不使用DataTable进行打印,因为它只包含最重要的列,而是从数据库中提取整个记录并将其传递给打印控件。

    我还尝试用缺少的结果扩展现有的DataTable,但这似乎比使用IN(…)查询慢。

    2 回复  |  直到 14 年前
        1
  •  3
  •   ircmaxell    14 年前

    很难看,但你可以做到:

    ORDER BY CASE invoice_id WHEN 13 THEN 0 WHEN 15 THEN 1 WHEN 9 THEN 2 WHEN 27 THEN 3 ELSE 4 END
    

    实际上,这里有一个字段函数:

    ORDER BY FIELD(invoice_id, 13, 15, 9, 27)
    

    这个 FIELD function

    或者,如果是动态生成,可以执行以下操作:

    WHERE invoice_id IN ({list}) ORDER BY FIND_IN_SET(invoice_id, '{list}')
    
        2
  •  3
  •   Daniel Roseman    14 年前

    FIELD 按参数排序。

    SELECT * FROM invoice WHERE invoice_id IN (13, 15, 9, 27) ORDER BY FIELD (invoice_id, 13, 15, 9, 27)