假設我有下表,排名,
|film_id|user_id|rank|
|-------|-------|----|
|1 |1 |2 |
|2 |1 |3 |
|3 |1 |1 |
|1 |2 |2 |
|2 |2 |1 |
|3 |2 |3 |
我洗掉了電影 id 2。
是否有一種 MySQL 方法可以在單個查詢中重新排列每個用戶的剩余電影,例如:
|film_id|user_id|rank|
|-------|-------|----|
|1 |1 |2 |
|3 |1 |1 |
|1 |2 |1 | <- changed from 2 to 1
|3 |2 |2 | <- changed from 3 to 2
為清楚起見進行編輯:我不確定我會確切地稱其為公式,但我想要做的就是有一個查詢,按排名順序加載剩余的電影,然后以相同的順序重建排名,并且連續的。
換句話說,如果洗掉一行后,用戶的排名上升到1、2、4、5、6,我希望它從1(1、2、3、4、5)開始重建為連續的。
謝謝!
uj5u.com熱心網友回復:
將表連接到使用ROW_NUMBER()視窗函式重建排名的查詢:
UPDATE tablename t1
INNER JOIN (
SELECT *, ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY `rank`) rn
FROM tablename
) t2 ON t2.film_id = t1.film_id AND t2.user_id = t1.user_id
SET t1.`rank` = t2.rn
WHERE t1.`rank` <> t2.rn; -- actually this in not needed
-- as MySql does not perform the update
-- if the current and new values are the same
請參閱演示。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/315256.html
下一篇:連接特定行值的列值
