我有一张module cal(
input [3:0] a,
input [3:0] b,
input [7:0] c,
input [2:0] op,
input clk,
input reset,
input en,
input r_w,
output reg [7:0] f1,
output reg [7:0] f2
);
的表格。我抓住了人们最喜欢的fav_tweet_ids
。我看到很多人喜欢同一条推文,在专栏中我看到很多相同的tweet_ids
。我想选择所有这些行,我也想更新所有这些行。
我的专栏是
tweet_ids
,id
,username
,tweet_id
,date
,processing
,status
。
我想更新favs_status
= 0和status
= 1和processing
= 0.
这是样本数据:
favs_status
答案 0 :(得分:2)
;WITH cte AS (
SELECT
*
,ROW_NUMBER() OVER (PARTITION BY tweet_id, user_id ORDER BY id) as RowNum
FROM
fav_tweet_ids
WHERE
fav_status = 1
)
UPDATE cte
SET processing = 1
,status = 0
,fav_status = 0
WHERE
RowNum > 1
有几种方法,但这是一种使用可更新的公用表表达式,这使得它非常简单。其他方法是首先找到所有重复的tweet_ids,然后使用连接更新回来。
MySQL版本根据需要更新除1行之外的所有内容。如果你想要所有用户/推文组合的行有更容易的方法,这很可能是你想要保留的。这假设您可以使用mysql变量:
仅根据tweet_id进行更新而不是用户
UPDATE sent_retweet_tweet_ids u
INNER JOIN
(
SELECT
id
,@rownum:=IF((@prevtweet = t.tweet_id), @rownum + 1, 1) as RowNum
,@prevtweet:= t.tweet_id
FROM
sent_retweet_tweet_ids t
CROSS JOIN (SELECT @rownum:=0, @prevtweet:=0) var
WHERE
t.fav_status = 1
ORDER BY
t.date
) r
ON u.id = r.id
AND r.RowNum > 1
SET
u.processing = 1
,u.status = 0
,u.fav_status = 0
SQL小提琴示例:
仅在用户多次喜欢推文时更新:http://sqlfiddle.com/#!9/42fb74/1
当同一条推文超过1时更新9或10位用户:http://sqlfiddle.com/#!9/31c9e
答案 1 :(得分:1)
您可以使用CTE
和ROW_NUMBER
来识别重复项。然后UPDATE
CTE
条记录的值ROW_NUMBER
大于1:
;WITH ToUpdate AS (
SELECT processing, status, favs_status,
ROW_NUMBER() OVER (PARTITION BY tweet_id ORDER BY date) AS rn
FROM fav_tweet_ids
)
UPDATE ToUpdate
SET processing = 1, status = 0, favs_status = 0
WHERE rn > 1
UPDATE
传播到与所选CTE
记录对应的实际表记录。