ВЫБЕРИТЕ ГДЕ 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)
Другие вопросы по тегам