@amvero

Как найти записи с одинаковыми полями?

Здравствуйте!

Есть таблица вида:
ID | Category | Field1 | .... | FieldN

В ней ID — первичный-ключ автоинкремент, Category — некая строка, остальные поля содержат некие данные.

Для каждой Category существует >=1 записей, у которых хотя бы поле с данными будет уникальным (в пределах категории). То есть:
ID | Category | Field1 | ... | FieldN
1 | category1 | somedata | ... | somedata
2 | category1 | otherdata | ... | somedata
3 | category1 | somedata | ... | otherdata 
4 | category2 | otherdata | ... | somedata 
5 | category3 | somedata | ... | somedata
6 | category4 | unique data | ... | unique data


Необходимо: для категории x найти все категории, у которых данные в одинаковом столбце совпадают. То есть, в примере выше, для category4 таких записей не будет, для остальных трёх будут две других.

В грязном виде это будет выглядеть так:
-- получим все возможные варианты полей в первой категории
SELECT `Field1`, ...,  `FieldN` FROM `table` WHERE `Category`='category1'

-- найдём все категории, у которых поля совпадают, и которые не являются первой категорией
SELECT `Category` FROM `table` 
WHERE ( `Field1` IN ( соответствующий столбец из первого запроса )
OR `FieldN` IN ( ... ) ) 
AND `Category`!='category1'


Можно ли этот запрос составить лучше?
  • Вопрос задан
  • 2930 просмотров
Пригласить эксперта
Ответы на вопрос 2
@BorisKorobkov Куратор тега MySQL
Web developer
Как-то все запутанно с полями. Для понимания лучше указать реальные данные.

Вариант 1.
Если я правильно понял, то достаточно найти повторяющиеся значения
SELECT Field1 
FROM MyTable 
GROUP BY Field1 
HAVING COUNT(*) > 1

а потом по ним записи
SELECT * 
FROM MyTable 
WHERE  Field1 = ...


Вариант 2.
SELECT * 
FROM MyTable MyTable1, MyTable MyTable2 
WHERE  MyTable1.Field1 = MyTable2.Field1 AND MyTable1.Category != MyTable2.Category
Ответ написан
Комментировать
@Fortop
Tech/Team lead
Попробуйте следующий вариант.
На БД не проверил.
SELECT t1. category, t2.category
FROM table as t1
JOIN table as t2 ON t1.Field1=t2.Field1
OR t1.Field2=t2.Field2
....
OR t1.FieldN = t2.FieldN
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы