请在继续之前阅读此内容:Filter an unfiltered table against a whitelist table
因此,我目前设置了一个白名单表,如引用的链接所示,并且我遇到了该表带来的另一个问题,即检查每列的唯一性。根据 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 ID 并重新选择它,但我想知道是否可以在一个 SQL 查询调用中而不是两次调用中完成此操作。
编辑:哎呀,上面的例子有一个错误(不小心在那里使用了真实的模式xD)
编辑2:哦,我突然想到为什么要把事情复杂化,为什么不简单地这样做......
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
...但仍然失败,因为不能在两个 NULL 列上使用=。呃,这么近却这么远>.<
致:比尔·卡尔文
这正是问题所在。如果我在国家、地区、项目上设置唯一键,然后执行以下 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.
因此,这篇文章的想法是将所有重复的白名单列出在一个列表中,以便运算符(operator)可以决定保留哪些内容以及删除哪些内容。
最佳答案
不热衷于这个解决方案,但可行:-
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)
关于php - SELECT WHERE IN 以 GROUP_CONCAT 作为输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47689406/