根据其他2列的值更新列

时间:2018-10-15 06:30:14

标签: mysql sql sql-update

我有user_contents表。这是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_id是新添加的列。我需要根据content_type和user_id的值更新order_id的值。 content_type可以为0或1。

Expected Result

根据content_type和user_id,我必须更新order_id,如以上结果所示。对于相同的user_id和content_type order_id,需要从0开始递增。

有人可以帮助我进行更新查询

我正在使用版本 5.7.23-0ubuntu0.16.04.1

mysql 数据库

编辑:--现在,需求已稍有变化。而不是将user_id的data_type int更改为varchar保存值,例如DAL001,HAL001等

3 个答案:

答案 0 :(得分:4)

请尝试以下查询,以更新order_id的值。它使用User-defined session variables

此查询基本上由两部分组成。第一部分根据定义的逻辑为每个order_id确定id

第二部分使用user_contentsid表联接并更新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  

答案 1 :(得分:3)

使用视图来实现所需的效果会更好。这是一个没有窗口功能且没有会话变量的选项:

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列显然是派生的数据。这意味着您将来可能不得不再次进行更多更新。因此,视图仅在实际需要时生成所需的输出,从而完全避免了此问题。

答案 2 :(得分:0)

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后,增加订单ID并传递到某个变量,然后使用更新查询进行更新。