我必须根据自定义偏好重新排列行。
表结构是这样的。
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
。
这样做的简单方法是将列(顶部)重新分配给所需的首选项,这是我无法做到的,因为有数百行可以使用,所以我需要一些自动逻辑。
请参阅并建议任何可行的方法。
答案 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