ВЫБЕРИТЕ ГДЕ IN с GROUP_CONCAT в качестве ввода
Пожалуйста, прочитайте это перед тем, как продолжить: отфильтруйте нефильтрованную таблицу и таблицу белых списков
Итак, у меня в настоящее время есть таблица белого списка, настроенная, как показано в ссылочной ссылке, и я сталкиваюсь с еще одной проблемой, поднятой упомянутой таблицей, то есть для проверки УНИКАЛЬНОСТИ каждого столбца. Что касается спецификации MySQL, то для столбца NULL невозможно установить значение UNIQUE, поэтому я решил найти другое решение для проверки дублирования строк с помощью запроса SELECT GROUP BY следующим образом.
SELECT GROUP_CONCAT(ID) AS IDs, country, region, item, count(*) AS amount
FROM whitelist
Теперь, чтобы проверить, дублирован ли элемент, я перевернул его поверх другого слоя.
SELECT IDs, country, region, item, amount
FROM (SELECT GROUP_CONCAT(ID) AS IDs, country, region, item, count(*) AS amount
FROM whitelist) tmp
WHERE amount > 1
Все еще работает нормально, как задумано, но вопрос начинается здесь.
Могу ли я использовать эти данные и повторно выбрать таблицу белых списков, чтобы я мог получить каждую запись в виде строки с чем-то вроде...
SELECT ID, country, region, item
FROM whitelist
WHERE ID IN (SELECT group_concat(ID)
FROM (SELECT group_concat(ID) AS ID, country, region, item, COUNT(*) AS AMOUNT
FROM whitelist
GROUP BY country, region, item) tmp
WHERE AMOUNT > 1)
Конечно, я мог бы просто использовать PHP, взорвать идентификаторы group_concat и повторно выбрать его, но мне интересно, возможно ли сделать это в одном вызове SQL-запроса вместо двух.
Редактировать: Ой, в приведенном выше примере была ошибка (случайно использовалась реальная схема там xD)
Edit2: Doh, я вдруг подумал, почему все усложняет и почему бы просто не пойти с этим...
SELECT wl1.ID, wl1.country, wl1.region, wl1.item, wl1.reason
FROM whitelist wl1,
(SELECT country, region, item
FROM whitelist
GROUP BY country, region, item
HAVING count(*) > 1) wl2
WHERE wl1.country = wl2.country AND
wl1.region = wl2.region AND
wl1.item = wl2.reason
... но все равно не работает, потому что вы не можете использовать = в двух пустых столбцах. Ух, так близко, пока так далеко>.<
Кому: Билл Карвин
Это именно проблема здесь. Если я установлю уникальный ключ для страны, региона, элемента и выполню следующий SQL-запрос, это произойдет.
INSERT INTO whitelist(country, region, item) VALUES ('Taiwan', 'Asia', 'PC');
INSERT INTO whitelist(country, region, item) VALUES ('Taiwan', 'Asia', 'PC');
-- Would fail due to UNIQUE check
Тем не менее, если я включу любой из подстановочных знаков, иначе NULL, и это произойдет.
INSERT INTO whitelist(country, region, item) VALUES (NULL, 'Asia', 'Rice');
INSERT INTO whitelist(country, region, item) VALUES (NULL, 'Asia', 'Rice');
-- Would succeed due to UNIQUE does not check NULL columns.
Следовательно, идея этого поста состоит в том, чтобы перечислить все повторяющиеся белые списки в списке, чтобы оператор мог решить, что сохранить, а что удалить.
1 ответ
Не заинтересованный в этом решении, но жизнеспособный:
SELECT a.ID,
a.country,
a.region,
a.item
FROM whitelist a
INNER JOIN
(
SELECT group_concat(ID) AS ID, USERNAME, COMPNAME, PUBLISHER, NAME, VERSION, COUNT(*) AS AMOUNT
FROM software_checklist
GROUP BY USERNAME, COMPNAME, PUBLISHER, NAME, VERSION
HAVING AMOUNT > 1
) tmp
ON FIND_IN_SET(a.ID, tmp.ID)