我正在使用mySql,我的记录位于表的末尾。我想把它带到桌面的顶端。怎么能动呢?我的意思是表格顶部有条目,如何将两个条目的ID替换为彼此。
我想这样做,因为我想将最后一项移到列表的开头,以便它首先出现在我的网站上。
感谢
答案 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 */