У меня есть такая таблица
CREATE TABLE "items" (
"id" int(11) NOT NULL AUTO_INCREMENT,
"id_ur" varchar(255) NOT NULL,
"window_key" varchar(255) DEFAULT NULL,
PRIMARY KEY ("id"),
KEY "idx_window_key" ("window_key") USING BTREE,
KEY "idx_id_ur" ("id_ur") USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=latin1;
Эта таблица содержит 19 000 00 строк.
Мне нужно выбрать все записи, которые разделяют поле id_ur
с другим window_key
.
Например, если бы у меня были записи вроде следующего:
id,id_ur,window_key
1,"123","ABC"
2,"124","DEF"
3,"123","ABD"
4,"124","DEF"
Мне нужно вернуть «123», а не «124».
Я ищу эффективный способ сделать это в MySQL Community Server, версия 5.7.22.
Я попробовал следующее:
select c1.id_ur
from items c1
inner join items c2
on c1.id_ur = c2.id_ur
where c1.window_key <> c2.window_key;
Но это не совсем так.
Я пытался выразить это с помощью предложения group by, но я не знаю, как выразить группировку строк, которые не отличаются в определенном столбце.
У меня есть индексы как для полей id_ur
, так и window_key
. Я не уверен, было бы полезно добавить индекс для обоих полей.
Я ищу достойный запрос для получения этих записей.
Благодаря некоторой помощи, которую я получил, я смог найти более эффективные решения.
Это результат теста:
select distinct c1.id_ur
from item c1, item c2
where c1.id_ur = c2.id_ur
and c1.window_key <> c2.window_key
-- 1483 secs
select c1.id_ur
from item c1
inner item c2
on c1.id_ur = c2.id_ur
where c1.window_key <> c2.window_key;
-- 675 secs
select distinct c1.id_ur
from item c1
group by c1.id_ur
having count(distinct c1.window_key) > 1
-- 170 secs
SELECT dt.id_ur
FROM
(
SELECT DISTINCT c1.id_ur, c1.window_key
FROM gbmlive.canonical AS c1
) AS dt
GROUP BY dt.id_ur
HAVING COUNT(*) > 1
-- 376 secs
Так что самым быстрым решением была группа с четким количеством.