我有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 数据库编辑:--现在,需求已稍有变化。而不是将user_id的data_type int更改为varchar保存值,例如DAL001,HAL001等
答案 0 :(得分:4)
请尝试以下查询,以更新order_id
的值。它使用User-defined session variables。
此查询基本上由两部分组成。第一部分根据定义的逻辑为每个order_id
确定id
。
第二部分使用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
答案 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
);
建议在此处进行更新的主要问题是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并传递到某个变量,然后使用更新查询进行更新。