php - SELECT WHERE IN 以 GROUP_CONCAT 作为输入

标签 php mysql select group-concat where-in

请在继续之前阅读此内容: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/

相关文章:

javascript - 如何使用jquery将图像显示为html文件? (一些 php 和 xml)

php - 在 URL 中传递参数(不使用 php GET)

php - 创建用户登录/注册页面时如何将 iOS 应用程序与数据库连接?

mysql - 使用 2 台 MySQL 服务器

mysql - 使用选择相同的表进行更新[mysql]

php - 网站打印出代码

mysql - MySQL 是否支持数字或数字通配符模式?

mysql - 查询同一个表中的特定名称(MySQL)

javascript - 在选择中检查javascript

c# - Azure:使用 PHP 作为 WebRole 并使用 C# 作为 WorkRole?如何打包服务包?