我有一张表,其中新主菜获取数字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 =已发表的声明,但我不知道如何。 我应该研究什么解决方案?
非常感谢,
萨姆
答案 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,还是有不同的解决方案?
谢谢