Мне нужно выполнить прямо сейчас, но вот запрос для начала:
SELECT id, foreign_key,
group_concat(DISTINCT fieldA) as A, count(DISTINCT fieldA) as `#A`,
group_concat(DISTINCT fieldB) as B, count(DISTINCT fieldB) as `#B`
FROM t1
GROUP BY foreign_key
;
На тестовых данных это возвращает:
| id | foreign_key | A | #A | B | #B |
+----+-------------+-------+----+------+----+
| 1 | 1 | A1 | 1 | B1 | 1 |
| 4 | 2 | A2,A3 | 2 | B2 | 1 |
| 6 | 3 | NULL | 0 | NULL | 0 |
| 7 | 4 | A4 | 1 | B4 | 1 |
| 8 | 5 | A5 | 1 | B5 | 1 |
| 10 | 6 | A6,A7 | 2 | B6 | 1 |
| 12 | 7 | NULL | 0 | B7 | 1 |
Запрос на сохранение строк:
SELECT id, foreign_key,
group_concat(DISTINCT fieldA) as A, count(DISTINCT fieldA) as `#A`,
group_concat(DISTINCT fieldB) as B, count(DISTINCT fieldB) as `#B`
FROM t1
GROUP BY foreign_key
HAVING `#A` < 2 AND `#B` < 2
;
Запрос на строки, требующие вмешательства оператора:
SELECT id, foreign_key,
group_concat(DISTINCT fieldA) as A, count(DISTINCT fieldA) as `#A`,
group_concat(DISTINCT fieldB) as B, count(DISTINCT fieldB) as `#B`
FROM t1
GROUP BY foreign_key
HAVING `#A` >= 2 OR `#B` >= 2
;
GROUP_CONCAT
может не подходить, в зависимости от формата сохраняемых данныхв столбцах.Однако в сочетании с #A и #B вы можете определить, когда это не подходит, поэтому это не должно быть большой проблемой.Это также может оказать слишком большое влияние на производительность, но я не могу представить другую агрегатную функцию, которая могла бы использоваться таким же образом (GROUP_COALESCE
было бы неплохо).