将一个条目从表的末尾移动到顶部

时间:2012-11-07 19:38:02

标签: mysql sql

我正在使用mySql,我的记录位于表的末尾。我想把它带到桌面的顶端。怎么能动呢?我的意思是表格顶部有条目,如何将两个条目的ID替换为彼此。

我想这样做,因为我想将最后一项移到列表的开头,以便它首先出现在我的网站上。

感谢

6 个答案:

答案 0 :(得分:1)

您可以通过以下方式使用自定义订单:

select * from mytable
order by if(id = 1234, -1, id); -- change "1234" to id of row you want first

答案 1 :(得分:0)

假设您不想更改数据库中的数据结构...

获取结果集的数组并在PHP中执行此操作。如果您只更改列表中一个项目的顺序,请不要在SQL中执行此操作。

  $resultSet = $connection->query("some query");
  if(is_array($resultSet)){

      //pop the last item in array out of array
      $itemToMove = array_pop($resultSet);

      //insert the item at the start of the array
      array_unshift($resultSet, $itemToMove);
   }

答案 2 :(得分:0)

我猜你有SELECT * FROM data ORDER BY id这样的东西,你想带来想要得到id 50 id 1.以下两个陈述应该有所帮助:

UPDATE data SET id = id + 1 ORDER BY id DESC;
UPDATE data SET id = 1 WHERE id = 51;

请注意,当您使用第一个语句向每个id添加1时,您需要在第二个语句中更新id 51。

如果您的SELECT不包含ORDER子句(应该如此),也可以这样做:

ALTER TABLE data ORDER BY id;

希望这有帮助。

此致

TC

答案 3 :(得分:0)

如果只需要显示表格顶部的最后一行,您可以使用:

SELECT *
FROM your_table
ORDER BY id = (select id from your_table order by id desc limit 1) DESC, id

子查询总是返回最后一个id(你也可以使用max(id)),如果条件满足它的值是1,否则它是0因此DESC所以满足条件的行先搬了。

如果您还需要显示交换的ID,这可能是一个想法:

SELECT IF(id=1,
          (select max(id) from your_table),
          if(id=(select max(id) from your_table),1,user_id)) as id
FROM your_table
ORDER BY id

(首先id始终为1?如果没有,则必须将1替换为select min(id) from your_table

但是你真的想交换这些值,而不只是以不同的顺序显示行吗?遗憾的是,在MySql中无法执行此操作:

UPDATE your_table SET id = (select max(id) from your_table) + 1 WHERE id = 1
UPDATE your_table SET id = 1 WHERE id = (select max(id) from your_table) - 1
UPDATE your_table SET id = id-1 WHERE id = (select max(id) from your_table)

(并且,顺便说一句,如果最小值不同于1则会丢失),因为如果在子查询中引用它,则无法更新表。我发布了另一个有效且仅使用连接的解决方案!

答案 4 :(得分:0)

我已经使用SELECT发布了一个解决方案,但我不确定是否可以使用UPDATE,但我发现了如何做到这一点。

我知道这有点奇怪,但我认为这是唯一一个始终有效的解决方案,并且始终只使用一个查询并且不知道它们的值,将id与最后id进行交换:

update
  your_table
  inner join (select max(id) as max from your_table) mx
  inner join (select min(id) as min from your_Table) mn
  on your_table.id = mx.max
  or your_table.id = mn.min
set id=if(id=mx.max,mn.min,mx.max)

或者如果您只需要将最后一个放在顶部,并移动每隔一行,这样的事情可能会有效:

update your_table
  inner join (select max(id) as max from your_table) mx
  inner join (select min(id) as min from your_table) mn
set id=if(your_table.id=mx.max,mn.min,id+1)

但请注意,如果id是主键,这可能不起作用,如果是这种情况,我认为只能在一次传递中完成。

答案 5 :(得分:-1)

我认为select查询中的一个简单ORDER BY将无法满足您的需求,所以这里有一种物理替换id = 123的行的方法,其中行id = 1,假设您的表有超过123行

update table_name set id=(select max(id)+1) from table_name where id=123;
/* this will move the last record to somewhere temporary */

update table_name set id=123 where id=1 ;
/* this will move the first row to the place of the row that was at the bottom */

update table_name set id=1 where id=(select max(id) from table_name);
/* moving from temporary row to the first of the table */