4

我有 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。

预期结果

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

有人可以帮我更新查询吗

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

编辑: - - 现在要求略有改变。user_id 的 data_type int 改为 varchar 保存值,如 DAL001、HAL001 等

4

3 回答 3

4

尝试以下查询以更新order_id值。这使用了用户定义的会话变量

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

第二部分使用并更新值与user_contents表连接。idorder_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  
于 2018-10-15T06:41:01.443 回答
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
);

在此处输入图像描述

演示

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

于 2018-10-15T06:40:27.137 回答
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 并传递给某个变量并使用更新查询进行更新。

于 2018-10-15T06:58:57.947 回答