我想更新重复的表条目

时间:2016-08-30 16:04:39

标签: php mysql sql database

我有一张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_idsidusernametweet_iddateprocessingstatus

我想更新favs_status = 0和status = 1和processing = 0.

这是样本数据:

favs_status

2 个答案:

答案 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)

您可以使用CTEROW_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记录对应的实际表记录。