Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 将选择查询转换为更新查询-为每个组的行编号_Mysql_Sql Update - Fatal编程技术网

Mysql 将选择查询转换为更新查询-为每个组的行编号

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 只需执行下面的更新查询即可实现您的目标。

我有一个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

只需执行下面的
更新
查询即可实现您的目标。并确保通过添加
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