Home > other >  Order index for rows related to another table
Order index for rows related to another table

Time:10-14

I have a table that stores an id from another table, an index for a specific id and some different value

user_id index_value some_value
1 0 01
1 1 02
1 2 03
2 0 04
3 0 05
3 1 06
1 3 07

I'm about to delete some records and I need to recalculate the data stored in index_value. For example, delete the line with some_value 03.The expected output should look like this:

user_id index_value some_value
1 0 01
1 1 02
2 0 04
3 0 05
3 1 06
1 2 07

What is the best way to go about this?

CodePudding user response:

I suggest not even maintaining the index_value column, but instead generating this computed value at the time you query. Assuming you are using MySQL 8 :

SELECT
    user_id,
    ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY some_value) - 1 AS index_value,
    some_value
FROM yourTable
ORDER BY some_value;

CodePudding user response:

Used suggestions from Tim Biegeleisen and Akina. After recalculating the indexes, a query is called to remove unnecessary rows.

UPDATE table AS t
SET index_value =
    (SELECT new_index_value 
    FROM (
        SELECT *, ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY index_value) - 1 AS new_index_value 
        FROM table WHERE user_id IN (
            SELECT user_id FROM table WHERE some_value='some value'
            GROUP BY user_id)
        AND NOT some_value='some value'
        ORDER BY ID)
    WHERE ID = t.ID
)
WHERE user_id IN (
    SELECT user_id 
    FROM table 
    WHERE some_value='some value'
    GROUP BY user_id)
AND NOT some_value='some value';
  • Related