У меня есть таблица базы данных с этими столбцами:
local domain email_sha256 password password_sha256
a b ... C ...
a bb ... C ...
a bb ... CC ...
a bbb ... C ...
aa bb ... CCC ...
aa bb ... CC ...
Часть local
и domain
- это, по сути, электронная почта, разделенная на символ @.
test@gmail.com
local = test
domain = gmail.com
Я хочу найти все строки с одинаковыми local
и password
пара, но есть другой domain
.Это вернуло бы что-то вроде, если бы я взял только столбцы local
, domain
и password
local domain password
a b C
a bb C
a bbb C
Я пытался сначала идентифицировать все пары local
, password
, которыеесть дубликаты, с:
SELECT local, password
FROM tablename
GROUP BY local, password
HAVING count(*) > 1
Теперь, чтобы получить больше столбцов, чем просто GROUP BY
Я делаю JOIN
для самой таблицы
SELECT local, domain, password
FROM tablename
JOIN (SELECT local, domain FROM tablename GROUP BY local, password HAVING count(*) > 1)
USING (local, password)
Теперь, чтобы убедиться, чтодомен другой. Я снова присоединяюсь к таблице и добавляю предложение WHERE
.Чтобы избежать повторения, я использую GROUP BY
.Вот мой последний запрос.
SELECT A.local, A.domain, A.password
FROM tablename as A
JOIN
(SELECT local, domain, password
FROM tablename
JOIN
(SELECT local, password
FROM tablename
GROUP BY local, password
HAVING count(*) > 1)
USING (local, password)) as B
USING (local, password)
WHERE A.password = B.password AND A.domain != B.domain AND A.local = B.local
GROUP BY local, domain, password
ORDER BY local, password
Я удаляю потенциальные действительные результаты с этим запросом?Кроме того, есть ли более быстрый / лучший запрос для выполнения и достижения того же результата?
Спасибо.
Примечание. Эта таблица не имеет уникальных идентификаторов, но у меня, вероятно, нет дубликатов email_sha256
, password_sha256
пар, чтобы их можно было использовать в качестве идентификатора.