MYSQL удаление повторяющихся строк на основе 3 столбцов - PullRequest
0 голосов
/ 12 октября 2018

РЕДАКТИРОВАТЬ версию SQL (mysql 5.7), которую я имею, не поддерживает row_number() ... какой альтернативный метод я могу использовать?

Я выяснил, что с использованием row_number() где мой запрос я бы применил ... столбцы, которые я хочу проверить: user_id racid и ios

SELECT 
    ur.user_id,
    u.racid,
    u.fname,
    u.lname,
    u.email,
    u.last_login,
    ur.role_id,
    r.name AS role_name,
    i.device_token AS ios,
    dg.group_name,
    dg.ad_group,
    a.device_token AS android
FROM
    users AS u
        LEFT OUTER JOIN
    user_roles AS ur ON u.id = ur.user_id
        LEFT OUTER JOIN
    roles AS r ON ur.role_id = r.id
        LEFT OUTER JOIN
    ios_tokens AS i ON u.racid = i.racf_id
        LEFT OUTER JOIN
    android_tokens AS a ON u.racid = a.racf_id
        LEFT OUTER JOIN
    dashboard_groups AS dg ON dg.role_id = r.id

Текущая таблица после присоединения

user_id, racid, fname, lname, email, last_login, role_id, role_name, ios, group_name, ad_group, android

Ответы [ 2 ]

0 голосов
/ 12 октября 2018

Речь идет не об удалении повторяющихся строк, но если вам нужна уникальность из одной таблицы для нескольких столбцов, вы можете использовать уникальный индекс с несколькими столбцами.Если это не так, вам следует игнорировать это.

ALTER TABLE `users` ADD UNIQUE `unique_index`(`col1`, `col2`, `col3`);

Как указать уникальное ограничение для нескольких столбцов в MySQL?

0 голосов
/ 12 октября 2018

Вы можете попробовать ниже, это будет работать для mysql 8 +

select * from 
(SELECT 
    ur.user_id,
    u.racid,
    u.fname,
    u.lname,
    u.email,
    u.last_login,
    ur.role_id,
    r.name AS role_name,
    i.device_token AS ios,
    dg.group_name,
    dg.ad_group,
    a.device_token AS android,row_number() over(partition by ur.user_id,u.racid,i.device_token order by ur.user_id,
    u.racid,i.device_token) as rn
FROM
    users AS u
        LEFT OUTER JOIN
    user_roles AS ur ON u.id = ur.user_id
        LEFT OUTER JOIN
    roles AS r ON ur.role_id = r.id
        LEFT OUTER JOIN
    ios_tokens AS i ON u.racid = i.racf_id
        LEFT OUTER JOIN
    android_tokens AS a ON u.racid = a.racf_id
        LEFT OUTER JOIN
    dashboard_groups AS dg ON dg.role_id = r.id
)X where rn<>1

ИЛИ Mysql ниже 8+ версии, вы можете попробовать следовать

select * from 
( SELECT 
            ur.user_id,
            u.racid,
            u.fname,
            u.lname,
            u.email,
            u.last_login,
            ur.role_id,
            r.name AS role_name,
            i.device_token AS ios,
            dg.group_name,
            dg.ad_group,
            a.device_token AS android,
             @row_number:=CASE
            WHEN @user_id = ur.user_id and @racid = u.racid and @evicetoken = i.device_token  THEN @row_number + 1
            ELSE 1
        END AS num,
        @user_id :=ur.user_id, @racid = u.racid, @evicetoken = i.device_token 
        FROM
            users AS u
                LEFT OUTER JOIN
            user_roles AS ur ON u.id = ur.user_id
                LEFT OUTER JOIN
            roles AS r ON ur.role_id = r.id
                LEFT OUTER JOIN
            ios_tokens AS i ON u.racid = i.racf_id
                LEFT OUTER JOIN
            android_tokens AS a ON u.racid = a.racf_id
                LEFT OUTER JOIN
            dashboard_groups AS dg ON dg.role_id = r.id,
        (SELECT @user_id:=0,@racid=0,@evicetoken=0,@row_number:=0) as t
)X where num<>1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...