使用php根据自定义条件重新排列行

时间:2013-01-16 13:12:09

标签: php mysql sql sql-order-by

我必须根据自定义偏好重新排列行。

表结构是这样的。

id(primary)    top    title
1              2      t1
2              1      t2   
3              5      t3  
4              3      t4 
5              4      t5     

结果由ORDER BY top ASC显示,结果为。

id(primary)    top    title
2              1      t2
1              2      t1   
4              3      t4  
5              4      t5 
3              5      t3

现在我想将此行置于顶部并从结果中删除一行。

id(primary)    top    title
6              NULL   t6

更改/按下一个位置/重新分配列(顶部)以显示此结果。

id(primary)    top    title
6              1      t6
2              2      t2
1              3      t1   
4              4      t4  
5              5      t5 

I.E现在,所有先前排序最高的行都会向下推送一个位置,行id=3 with top=5将被移除,如id=3 with top=NULL

这样做的简单方法是将列(顶部)重新分配给所需的首选项,这是我无法做到的,因为有数百行可以使用,所以我需要一些自动逻辑。

请参阅并建议任何可行的方法。

5 个答案:

答案 0 :(得分:2)

select
  id,
  case when id=6 then 1 else top+1 end top,
  title
from
  your_table
where
  id=6 or
  top!=(select max(top) from your_table where id!=6)
order by top

答案 1 :(得分:1)

array_pop( $results ); // Remove last row
array_unshift( $results, $new_row ); // Add new row to the beginning
foreach( $results as $index => &$value )
    $value['top'] = $index+1; //Reassign top so that it matches the index of the numerical array, which will always start counting from zero

答案 2 :(得分:1)

这些方面的一些东西,也许是:

select id, ifnull(top, 0)+1, title from theTable order by 2

答案 3 :(得分:1)

SELECT *
  FROM
  (
    SELECT ID, @TOP := @TOP + 1 Top, TITLE
    FROM table1 a, (SELECT @TOP := 1) r
    ORDER BY a.TOP
  ) s
UNION 
SELECT 6, 1, 't6'
ORDER BY TOP
LIMIT 5

答案 4 :(得分:1)

SELECT * FROM theTable ORDER BY id = {the id you want on top} DESC, top ASC

或顶部有多个

SELECT * FROM theTable ORDER BY id in (id,id,id) DESC, top ASC