Как найти дубликаты в БД?
Делаю запрос к БД на поиск дубликатов. Соединил 3 таблицы и хочу удалить значения, которые совпадают по полям (t_s.l, t_s.t, t_s.w, t_m.a). Сделал выборку на поиск дубликатов:
SELECT
count(t_s.l),
count(t_s.t),
count(t_s.w),
count(t_m.a)
FROM
tab_big as t_b
LEFT JOIN
tab_midl as t_m
on t_b.id = t_m.tb_id
LEFT JOIN
tab_small as t_s
on t_m.id = t_s.tm_id;
Вывод показал, что 6048 дубликатов.
Как мне посмотреть их и удалить после проверки?
Дополнение 2 (Да, по таблицам видно будет, что таблица "tab_midl" отличается полем "b", но тем не менее, ее НАДО считать Дублем, т.к. элементы в таблице "tab_small" одинаковы):
Таблица tab_big:
| id | val1 | val2 |
|---|---|---|
| 1 | aaa | bbb |
| 2 | bvb | sdd |
Таблица tab_midl:
| id | tb_id | a | b |
|---|---|---|---|
| 1 | 1 | 50 | 25 |
| 2 | 1 | 50 | 75 |
| 3 | 1 | 50 | 75 |
Таблица tab_small:
| id | tm_id | l | t | w | val_n |
|---|---|---|---|---|---|
| 1 | 1 | 10 | 20 | 30 | xc |
| 2 | 1 | 15 | 25 | 35 | sd |
| 3 | 2 | 10 | 20 | 30 | xc |
| 4 | 2 | 15 | 25 | 35 | sd |
| 5 | 2 | 15 | 5 | 3 | d |
| 6 | 2 | 15 | 7 | 7 | s |
Дополнение №3 (Отделил в запросах на создание дубли от недублей)
CREATE TABLE `tab_big` (
`id` int(11) NOT NULL,
`fl` float NOT NULL,
`f2` float NOT NULL,
`f3` float NOT NULL,
`f4` float NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
INSERT INTO `tab_big` (`id`, `fl`, `f2`, `f3`, `f4`) VALUES
(1, 0.0511719, 0.0878113, 0.894792, 0.430851),
(2, 0.0511719, 0.0878113, 0.894792, 0.430851),
(3, 0.06, 0.0878113, 0.894792, 0.430851),
CREATE TABLE `tab_midl` (
`id` int(11) NOT NULL,
`tb_id` int(11) DEFAULT NULL,
`f1` int(11) NOT NULL,
`f2` float NOT NULL,
`f3` float NOT NULL,
`f4` float NOT NULL,
`f5` float NOT NULL,
`a` float NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
INSERT INTO `tab_midl` (`id`, `tb_id`, `f1`, `f2`, `f3`, `f4`, `f5`, `a`) VALUES
(1, 1, 63, 0, 0, 1, 0.430851, 50),
(2, 1, 63, 0.176618, 0.262754, 0.308511, 1.1499, 50),
(3, 2, 63, 0, 0, 1, 0.430851, 50),
(4, 2, 63, 0.176618, 0.262754, 0.308511, 1.1499, 50),
(5, 3, 61, 0, 0, 2, 0.430851, 30),
(6, 3, 61, 0.176618, 0.262754, 0.308511, 1.1499, 70);
CREATE TABLE `tab_smal` (
`id` int(11) NOT NULL,
`tm_id` int(11) DEFAULT NULL,
`l` float NOT NULL,
`t` float NOT NULL,
`w` float NOT NULL,
`x` float NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
INSERT INTO `tab_smal` (`id`, `tm_id`, `l`, `t`, `w`, `x`) VALUES
(1, 1, 0.0973962, 0.705943, 0.0227891, 1),
(2, 1, 0.973962, 1.70594, 0.522, 0),
(3, 2, 0.0973962, 0.705943, 0.0227891, 1),
(4, 2, 0.973962, 1.70594, 0.522, 0)
(5, 3, 0.0973962, 0.705943, 0.0227891, 1),
(6, 3, 0.973962, 1.70594, 0.522, 0),
(7, 4, 0.0973962, 0.705943, 0.0227891, 1),
(8, 4, 0.973962, 1.70594, 0.522, 0)
(9, 5, 1.0973962, 3.705943, 5.0227891, 1),
(10, 6, 5.973962, 4.70594, 4.522, 0);
Дополнение 4:
Ответы (1 шт):
я хочу очистить БД от этих дублей, и оставить записи только минимальным значением поля "b" из таблицы "tab_midl"
DELETE t1
FROM tab_midl t1
JOIN tab_midl t2 USING (tb_id, a)
WHERE t1.b > t2.b
-- OR (t1.b = t2.b AND t1.id > t2.id)
;
перед тем как удалить дубли я хочу проверить - правильно ли ищутся дубли, если так, то я их удалю
Замени DELETE t1 на SELECT *.

