我正在使用 mySql,并且在表的末尾有一条记录。我想把它带到桌子的顶端。怎么能动呢?我的意思是表格顶部有条目,我怎样才能将两个条目的 ID 相互替换。
我想这样做是因为我想将最后一项移动到列表的开头,以便它首先出现在我的网站上。
谢谢
您可以通过以下方式使用自定义订单:
select * from mytable
order by if(id = 1234, -1, id); -- change "1234" to id of row you want first
假设您不想更改数据库中数据的结构......
获取结果集的数组并在 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);
}
我猜你有类似的东西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
如果只需要在表格顶部显示最后一行,您可以使用以下命令:
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 不同,它会丢失)因为如果在子查询中引用它,则无法更新表。我发布了另一个有效的解决方案,只使用连接!
我已经发布了一个仅使用 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 是主键,这可能不起作用,如果是这种情况,我认为它不能一次性完成。
我想选择查询中的简单 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 */