代码之家  ›  专栏  ›  技术社区  ›  Seena V P

基于其他2列的值更新列

  •  4
  • Seena V P  · 技术社区  · 6 年前

    我有用户目录。这是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。

    Expected Result

    根据内容类型和用户id,我必须更新订单id,如上面的结果所示。对于相同的用户标识和内容类型,订单标识需要从0递增。

    有人能帮我更新查询吗

    我正在使用 mysql数据库 版本数据库 5.7.23至0.16.04.1

    -现在,要求略有改变。用户id的数据类型不是int,而是varchar,包含DAL001、HAL001等值

    3 回复  |  直到 6 年前
        1
  •  4
  •   Madhur Bhaiya    6 年前

    尝试以下查询,以更新 order_id User-defined session variables .

    id

    第二部分与第三部分相结合 user_contents 表格使用 并更新 订单号

    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  
    
        2
  •  3
  •   Tim Biegeleisen    6 年前

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

    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
    );
    

    enter image description here

    Demo

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

        3
  •  0
  •   Reshma    6 年前
    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进行更新。