【问题标题】:mysql order by issuemysql 按问题排序
【发布时间】:2010-01-05 10:25:45
【问题描述】:

如果我有这样的查询:

SELECT * FROM table  WHERE id IN (3,6,1,8,9);

这个 ids 数组是在 php 中动态构建的, 顺序对我很重要。

$my_array =  array (3,6,1,8,9) ;

如何按元素在数组中出现的顺序对结果进行排序?

在 MYSQL 查询中可以做到这一点, 或者我必须通过 php 订购它?

【问题讨论】:

    标签: php mysql sql-order-by


    【解决方案1】:

    您可以按从列中派生的值进行排序。您可以使用CASE 运算符来指定顺序:

    SELECT * FROM table
    WHERE id IN (3,6,1,8,9)
    ORDER BY CASE id WHEN 3 THEN 1
                     WHEN 6 THEN 2
                     WHEN 1 THEN 3
                     WHEN 8 THEN 4
                     WHEN 9 THEN 5
             END
    

    【讨论】:

    • 这就是我想的答案 - 几年前我有一个极端案例需要这个解决方案。
    【解决方案2】:

    我还没有测试过,但是这个 PHP 解决方案应该可以工作:

    <?php
    
    $my_array =  array (3,6,1,8,9) ;
    
    $sql = 'SELECT * FROM table  WHERE id IN (3,6,1,8,9)';
    
    $sql .= "\nORDER BY CASE id\n";
    foreach($my_array as $k => $v){
        $sql .= 'WHEN ' . $v . ' THEN ' . $k . "\n";
    }
    $sql .= 'END ';
    
    echo $sql;
    
    ?>
    

    这会生成以下 SQL 代码:

    SELECT * FROM table  WHERE id IN (3,6,1,8,9)
    ORDER BY CASE id
    WHEN 3 THEN 0
    WHEN 6 THEN 1
    WHEN 1 THEN 2
    WHEN 8 THEN 3
    WHEN 9 THEN 4
    END
    

    【讨论】:

      【解决方案3】:

      如果您必须这样做,您将不得不在 PHP 中操作数据。 MySQL 只能按自然顺序升序或降序进行排序。

      但有疑问 - 为什么需要以这种特定顺序返回的数据?通过在代码中进一步重新调整某些内容,可能会更轻松地解决您的问题。

      【讨论】:

        【解决方案4】:
        SELECT * FROM table WHERE id IN (3,6,1,8,9) ORDER BY FIELD(id,3,6,1,8,9);
        

        【讨论】:

          【解决方案5】:

          您可以将结果加载到以 ID 作为索引的数组中:

           while ($row = mysql_fetch_array($l)) $items[$row['id']] = $row;
          

          然后简单地按您的顺序迭代它

           foreach ($my_array as $id) { $current_row = $items[$id]; ... }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-06-28
            • 2014-07-03
            • 2010-09-16
            • 2022-01-19
            相关资源
            最近更新 更多