仅在行具有相同值的情况下在mysql表中设置序列号

时间:2014-06-24 10:15:26

标签: mysql join row

我有一张表,其中新主菜获取数字0,状态为未发布。用户可以发布或取消发布行。当它们这样做时,发布的行应该得到一个连续的数字,但是应该跳过未发布的行。像这样:

status      | number
=============================
unpublished | 0
published   | 1
unpublished | 0
unpublished | 0
published   | 2
published   | 3
unpublished | 0
published   | 4

现在我使用:

mysql_query("update albums 
join (SELECT @i:=0) t
SET id =(@i:=@i+1)");

当用户发布内容时,会向所有行添加连续编号。 我需要像上面这样的东西,但有一些WHERE =已发表的声明,但我不知道如何。 我应该研究什么解决方案?

非常感谢,

萨姆

2 个答案:

答案 0 :(得分:1)

在UPDATE语句中尝试IF: -

UPDATE albums 
JOIN (SELECT @i:=0) t
SET id = IF(status='published', @i:=@i+1, 0)

然而,这不会一直有效,因为我认为你想要我没有ORDER BY子句(更新支持和订单子句)。

编辑 - 根据要求提供更多信息: -

专辑是一个MySQL表格。 MySQL中的UPDATE查询支持ORDER BY子句(以特定顺序更新记录),但仅适用于只有一个表的查询。在此查询中,子查询将加入相册表(即JOIN (SELECT @i:=0) t);虽然这实际上不是一个表,但似乎MySQL认为它是一个,因此在此更新中不允许使用ORDER BY子句。

@i 是用户定义的变量,可以通过单独的SQL语句进行初始化。如果您的查询是2个语句: -

SET @i:=0
UPDATE albums
SET id = IF(status='published', @i:=@i+1, 0)
ORDER BY albums.insert_date;

然后应该这样做(注意,我刚刚假设了一个随机列名insert_date来按顺序排列记录)。

然而,许多MySQL api不支持单个查询中的多个语句。由于@i是用户变量,因此它与数据库的连接有关。因此,如果您发出一个查询来初始化它,然后发出第二个查询(使用相同的连接)来处理UPDATE,它应该可以工作。

如果你在MySQLi上使用php,那么你可以使用mysqli-multi-query一次性完成这两项工作。

答案 1 :(得分:0)

Kickstarts的答案几乎就是我所需要的,只有当主菜被发布时,才应该获得最高的数字。现在它遵循数据库顺序,即按日期。我应该整合ORDER BY,还是有不同的解决方案?

谢谢