Mysql 将选择查询转换为更新查询-为每个组的行编号
我有一个select查询,它附加了一列顺序/增量编号,在Mysql 将选择查询转换为更新查询-为每个组的行编号,mysql,sql-update,Mysql,Sql Update,我有一个select查询,它附加了一列顺序/增量编号,在相册中的每一次更改都会以1重新开始。它是基于 如何将其修改为更新查询,而不是创建列行号,而是更新列TrackNum 预期结果: Album|Song|TrackNum Hits1|AAAA|1 Hits1|BBBB|2 Hits1|CCCC|3 Hits2|AAAA|1 Hits2|BBBB|2 Hits3|AAAA|1 Hits3|BBBB|2 Hits3|CCCC|3 Hits3|DDDD|4 只需执行下面的更新查询即可实现您的目标。
相册
中的每一次更改都会以1重新开始。它是基于
如何将其修改为更新查询,而不是创建列行号
,而是更新列TrackNum
预期结果:
Album|Song|TrackNum
Hits1|AAAA|1
Hits1|BBBB|2
Hits1|CCCC|3
Hits2|AAAA|1
Hits2|BBBB|2
Hits3|AAAA|1
Hits3|BBBB|2
Hits3|CCCC|3
Hits3|DDDD|4
只需执行下面的
更新
查询即可实现您的目标。并确保通过添加WHERE
子句指定要更新的行。见下文:
SELECT @i := 0;
UPDATE tablename SET TrackNum= (SELECT @i := @i + 1)
WHERE Album = 'Hits1';
此查询将执行您想要的操作(使用MySQL 5.6.17进行测试): 请注意,歌曲编号的顺序可能是随机的,您可能希望按唱片集、歌曲ASC或类似的内容添加一个
顺序以修复顺序(如果是这样,则应将其添加到派生表的末尾)
样本输出:
Album Song TrackNum
Hits1 AAAA 1
Hits1 BBBB 2
Hits1 CCCC 3
Hits2 AAAA 1
Hits2 BBBB 2
Hits3 AAAA 1
Hits3 BBBB 2
Hits3 CCCC 3
Hits3 DDDD 4
我不知道这将如何为相册
中的每一个更改按顺序添加数字,并在1处重新启动。这不会将所有TrackNum字段设置为1吗?这将仅对一组增量数字有效。我有很多专辑。请参见问题中的预期结果。我需要每个相册的数字以1重新开始。我修改了我的WHERE
子句。请重试。错误代码:1093。您不能在FROM子句中为update指定目标表“tablename”
也许,如果有,最好在应用程序端设置增量序列。我不太明白您的意思comment@Avidos当它完全可以直接作为一个查询时,为什么要在db之外进行呢?这就是为什么我使用“Maybe”这个词,因为它是一个建议。因为根据我到目前为止的经验,将系统的逻辑尽可能地放在应用程序端@jpwGreat!谢谢我要测试一下。只是一个简单的问题。为什么编号会被关闭?原始表是按键ID排序的,轨迹都是有序的。只是TrackNum数据已损坏。这有关系吗?@square\u如果不包含orderby
语句,大多数关系数据库都会返回无序的数据集。如果您有一个像ID这样的有序键,您可能希望将查询更改为按其排序,或者可能将其添加到派生表和外部where子句中。谢谢,谢谢。成功了。这是非常酷的,我学到了一些东西,你可以让一个临时表选择和复制整个结果。为了记录在案,我还添加了一个有序位。@square_eyes很乐意帮忙:)
SET @Album = '';
SET @num = 1;
UPDATE tablename t,
(SELECT
Song,
Album,
@num := IF(@Album = Album, @num + 1, 1) AS row_number,
@Album := Album AS dummy
FROM
tablename) t2
SET
t.TrackNum = t2.row_number
WHERE
t.album = t2.album AND t.song = t2.song;
Album Song TrackNum
Hits1 AAAA 1
Hits1 BBBB 2
Hits1 CCCC 3
Hits2 AAAA 1
Hits2 BBBB 2
Hits3 AAAA 1
Hits3 BBBB 2
Hits3 CCCC 3
Hits3 DDDD 4