2

我正在使用 mySql,并且在表的末尾有一条记录。我想把它带到桌子的顶端。怎么能动呢?我的意思是表格顶部有条目,我怎样才能将两个条目的 ID 相互替换。

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

谢谢

4

6 回答 6

1

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

select * from mytable
order by if(id = 1234, -1, id); -- change "1234" to id of row you want first
于 2012-11-07T19:44:05.373 回答
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);
   }
于 2012-11-07T19:39:53.590 回答
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 51,因为您使用第一个语句为每个 id 添加了 1。

如果您的 SELECT 不包含 ORDER 子句(因为它应该)也这样做:

ALTER TABLE data ORDER BY id;

希望这可以帮助。

问候

TC

于 2012-11-07T19:58:28.040 回答
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?如果不是,您必须将两者都替换1select 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 不同,它会丢失)因为如果在子查询中引用它,则无法更新表。我发布了另一个有效的解决方案,只使用连接!

于 2012-11-07T19:58:53.140 回答
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 是主键,这可能不起作用,如果是这种情况,我认为它不能一次性完成。

于 2012-11-07T20:57:22.843 回答
-1

我想选择查询中的简单 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 */
于 2012-11-07T19:42:09.757 回答