【问题标题】:Mysql order by specific ID valuesMysql 按特定 ID 值排序
【发布时间】:2012-01-09 12:08:58
【问题描述】:

是否可以使用预定义的一组列值 (ID) 按“排序依据”在 mysql 中排序,例如:排序依据 (ID=1,5,4,3) 所以我会得到记录 1、5、4, 3 在那个顺序?

更新:关于滥用 mysql ;-) 我必须解释为什么我需要这个......

我希望我的记录每 5 分钟随机更改一次排序。我有一个 cron 任务来执行更新表以在其中放置不同的随机排序顺序。只有一个问题!分页。我会有一个访问者来到我的页面,我会给他前 20 个结果。他将等待 6 分钟,然后转到第 2 页,由于排序顺序已经改变,他将得到错误的结果。

所以我想,如果他来到我的网站,我会将所有 ID 放入一个会话中,当他在第 2 页时,即使排序已经改变,他也会得到正确的记录。

还有其他更好的方法吗?

【问题讨论】:

  • 你是在问mysql有没有办法可以不按特定顺序排序?
  • 听起来您的数据模型已损坏/不完整(此订单来自哪里?),或者您正在滥用 MySQL。

标签: mysql sorting


【解决方案1】:

您应该可以为此使用CASE

ORDER BY CASE id
  WHEN 1 THEN 1
  WHEN 5 THEN 2
  WHEN 4 THEN 3
  WHEN 3 THEN 4
  ELSE 5
END

【讨论】:

    【解决方案2】:

    在mysql的官方文档上关于ORDER BY,有人发帖说这个问题可以使用FIELD,像这样:

    SELECT * FROM table ORDER BY FIELD(id,1,5,4,3)
    

    这是未经测试的代码,理论上应该可以工作。

    【讨论】:

      【解决方案3】:

      您可以使用 ORDER BY 和 FIELD 功能。 见http://lists.mysql.com/mysql/209784

      SELECT * FROM table ORDER BY FIELD(ID,1,5,4,3)
      

      它使用Field() 函数,根据文档,该函数“返回 str 在 str1、str2、str3、...列表中的索引(位置)。如果未找到 str,则返回 0”。所以实际上你通过这个函数的返回值对结果集进行排序,返回值是给定集合中字段值的索引。

      【讨论】:

      • 如果不使用,我似乎无法让它工作:WHERE ID IN (1,5,4,3)
      • 你将如何使用 None 值?
      【解决方案4】:

      还有另一种方法可以解决这个问题。添加一个单独的表,如下所示:

      CREATE TABLE `new_order` (
        `my_order` BIGINT(20) UNSIGNED NOT NULL,
        `my_number` BIGINT(20) NOT NULL,
        PRIMARY KEY (`my_order`),
        UNIQUE KEY `my_number` (`my_number`)
      ) ENGINE=INNODB;
      

      此表现在将用于定义您自己的订单机制。

      在其中添加您的值:

      my_order | my_number
      ---------+----------
             1 |         1
             2 |         5
             3 |         4
             4 |         3
      

      ...然后在加入这个新表时修改您的 SQL 语句。

      SELECT *
      FROM your_table AS T1
      INNER JOIN new_order AS T2 on T1.id = T2.my_number
      WHERE ....whatever...
      ORDER BY T2.my_order; 
      

      此解决方案比其他解决方案稍微复杂一些,但使用此解决方案,您无需在订单标准发生变化时更改SELECT-statement - 只需更改订单表中的数据即可。

      【讨论】:

        【解决方案5】:
        SELECT * FROM table ORDER BY id='8' DESC, id='5' DESC, id='4' DESC, id='3' DESC
        

        例如,如果我有 10 个注册表,这样 ID 1、5、4 和 3 将首先出现,其他注册表将随后出现。

        正常展示 1 2 3 4 5 6 7 8 9 10

        这样

        8 5 4 3 1 2 6 7 9 10

        【讨论】:

          【解决方案6】:

          如果您需要在结果中首先订购单个 id,请使用该 id。

          select id,name 
          from products
          order by case when id=5 then -1 else id end
          

          如果您需要从多个 id 的序列开始,请指定一个集合,类似于您在 IN 语句中使用的集合。

          select id,name 
          from products
          order by case when id in (30,20,10) then -1 else id end,id
          

          【讨论】:

          • 添加更多描述
          • 如果您只想对一个 id 使用 order by,则使用第一个查询,如果您想要多个 id,则使用第二个查询
          【解决方案7】:
          SELECT * FROM TABLE ORDER BY (columnname,1,2) ASC OR DESC
          

          【讨论】:

          • 您能进一步解释一下吗?这看起来与接受的答案相似,但我认为ASC OR DESC 的语法不正确
          • @NicoHaase ASC 和 DESC 之间的区别在于,如果您使用 asc,那么您在字段函数中使用的 id 将排在最后,如果您使用 DESC,那么字段函数中的 id 将首先出现
          • @NicoHaase 您可以根据要求将 ASC 或 DESC 与查询一起使用
          • 因此您不能在一个查询中同时使用两者。我认为 Nico 是在建议您在语法上正确地回答您的问题。我很确定他熟悉 ASD 和 DESC 的实际含义:)
          • 这毫无意义,绝对行不通。您需要使用 FIELD 函数,该函数与 8 年前接受的答案相同。
          【解决方案8】:

          如果您想在结果中最后排序单个 id,请按大小写使用顺序。 (例如:您希望最后一个“其他”选项,所有城市列表按字母顺序显示。)

          select id,city 
          from city
          order by case 
          when id = 2 then city else -1 
          end, city ASC
          

          例如,如果我有 5 个城市,我想按字母顺序显示城市,并在下拉列表中最后显示“其他”选项,然后我们可以使用此查询。 请参阅其他示例显示在我的表中的第二个 id(id:2) 所以我在上面的查询中使用“when id = 2”。

          数据库表中的记录:

          Bangalore - id:1
          Other     - id:2
          Mumbai    - id:3
          Pune      - id:4
          Ambala    - id:5
          

          我的输出:

          Ambala  
          Bangalore  
          Mumbai  
          Pune
          Other
          

          【讨论】:

          • 尝试在你的代码中添加一些解释,它会让你的答案更加清晰易懂。请阅读stackoverflow.com/help/how-to-answer
          • 如果您只想对一个 id 使用 order by(例如:您希望在最后一个“其他”选项并且所有城市列表按字母顺序显示。)所以您可以使用此查询。它对我有用。
          猜你喜欢
          • 1970-01-01
          • 2014-08-17
          • 2018-06-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多