mysql order by issue

前端 未结 5 1030
后悔当初
后悔当初 2021-01-06 09:57

if i have a query like :

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

this array of the ids is build in php dynamically , and the order is

相关标签:
5条回答
  • 2021-01-06 10:16

    If you must do it this way you'll have to manipulate the data in PHP. MySQL can only order by natural orderings ascending or descending.

    Got to question though - why do you need the data returned in this very specific order? There may be an easier solution to your problem by re-jigging something further up in the code.

    0 讨论(0)
  • 2021-01-06 10:21
    SELECT * FROM table WHERE id IN (3,6,1,8,9) ORDER BY FIELD(id,3,6,1,8,9);
    
    0 讨论(0)
  • 2021-01-06 10:21

    You can load the results into an array with IDs as indexes:

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

    and then simply iterate it in your order

     foreach ($my_array as $id) { $current_row = $items[$id]; ... }
    
    0 讨论(0)
  • 2021-01-06 10:26

    You can order by a value derived from a column. You can use a CASE operator to specify the order:

    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
    
    0 讨论(0)
  • 2021-01-06 10:37

    I haven't tested but this PHP solution should work:

    <?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;
    
    ?>
    

    This generates the following SQL code:

    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
    
    0 讨论(0)
提交回复
热议问题