0

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

表结构是这样的。

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 

IE 之前所有排在前面的行现在都被向下推到一个位置,并且行id=3 with top=5被删除,如id=3 with top=NULL.

这样做的简单方法是将列(顶部)重新分配给所需的偏好,我不能这样做,因为有数百行可供使用,所以我需要一些自动化逻辑。

请查看并建议任何可能的方法来做到这一点。

4

5 回答 5

1
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
于 2013-01-16T13:55:57.787 回答
0
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
于 2013-01-16T13:28:48.993 回答
0
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
于 2013-01-16T13:33:08.243 回答
0
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
于 2013-01-16T13:20:14.353 回答
0

沿着这些思路,也许:

select id, ifnull(top, 0)+1, title from theTable order by 2
于 2013-01-16T13:23:06.610 回答