Группа исполнителей по фильтрам по разнице - PullRequest
0 голосов
/ 28 октября 2018

У меня есть такая таблица

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

Так что самым быстрым решением была группа с четким количеством.

Ответы [ 2 ]

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

используйте group by и having одновременно:

select id_user
from items
group by id_user
having count(distinct window_key) > 1
0 голосов
/ 28 октября 2018

@ FatemehNB хороший ответ.Кроме того, вы также можете попробовать следующий запрос и сравнить производительность:

SELECT dt.id_ur 
FROM 
(
  SELECT DISTINCT c1.id_ur, c1.window_key 
  FROM items AS c1
) AS dt 
GROUP BY dt.id_ur 
HAVING COUNT(*) > 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...