基于其他2列的值更新列

muk1a3rh  于 2021-06-18  发布在  Mysql
关注(0)|答案(3)|浏览(432)

我有用户目录。这是ddl

CREATE TABLE `user_contents` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_id` int(11) NOT NULL,
  `content_type` int(11) NOT NULL,
  `order_id` int(11) DEFAULT '0',
  PRIMARY KEY (`id`),
  KEY `user_id` (`user_id`),
  CONSTRAINT `user_contents_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`)
)

order\u id是新添加的列。我需要根据content\u type和user\u id的值更新order\u id的值。content\u type可以是0或1。

根据内容类型和用户id,我必须更新订单id,如上面的结果所示。对于相同的用户标识和内容类型,订单标识需要从0递增。
有人能帮我更新查询吗
我使用的是5.7.23-0ubuntu0.16.04.1版本的mysql数据库
编辑:-现在要求略有改变。用户id的数据类型不是int,而是varchar,包含dal001、hal001等值

pdtvr36n

pdtvr36n1#

尝试以下查询,以更新 order_id 价值观。它使用用户定义的会话变量。
这个查询基本上由两部分组成。第一部分决定 order_idid ,基于定义的逻辑。
第二部分与第三部分相结合 user_contents 表格使用 id 并更新 order_id 价值观。

UPDATE user_contents AS uc 
JOIN 
(
  SELECT 
    dt.id, 
    @oid := IF(@uid = dt.user_id AND 
               @ct = dt.content_type, 
               @oid + 1, 
               0) AS order_id, 
    @uid := dt.user_id, 
    @ct := dt.content_type 
  FROM 
  (
    SELECT 
      id, 
      user_id, 
      content_type
    FROM user_contents 
    ORDER BY user_id, content_type
  ) AS dt 
  CROSS JOIN (SELECT @oid := 0, 
                     @uid := 0, 
                     @ct  := 0) AS user_init_params 
) AS dt2 ON dt2.id = uc.id 
SET uc.order_id = dt2.order_id
w6lpcovy

w6lpcovy2#

string SQL = "SELECT MAX(order_id) FROM user_contents 
WHERE user_id = 'label1' AND content_type ='label2'";

string sql = "UPDATE user_contents SET order_id='" +bb+ "' WHERE sl='1'";

在获得最大订单id之后,增加orderid并传递给某个变量,然后使用updatequery进行更新。

w3nuxt5m

w3nuxt5m3#

最好用一个视图来实现你想要的。以下是一个不使用窗口函数和会话变量的选项:

CREATE VIEW user_contents_view AS (
    SELECT
        id,
        user_id,
        content_type,
        (SELECT COUNT(*) FROM user_contents uc2
         WHERE uc2.user_id = uc1.user_id AND
               uc2.content_type = uc1.content_type AND
               uc2.id < uc1.id) order_id
    FROM user_contents uc1
);

演示

建议在这里进行更新的主要问题是 order_id 列显然是派生数据。这意味着您以后可能需要再次更新。因此,视图通过在实际需要时生成所需的输出来完全避免这个问题。

相关问题