Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 根据白名单表筛选未筛选的表_Mysql_Sql_Filtering - Fatal编程技术网

Mysql 根据白名单表筛选未筛选的表

Mysql 根据白名单表筛选未筛选的表,mysql,sql,filtering,Mysql,Sql,Filtering,导言 您好,我目前正在尝试构建一个基于MySQL的过滤系统,我现在遇到了一个问题,如何解决这个问题。我在下面的示例表链接中提供了两个表,一个是白名单表,其中包含白名单项目,另一个是未排序表,它是将根据白名单检查的项目列表 附:白名单在不断变化 问题 如果只是为了匹配,如果三列完全匹配,这将是一项非常简单的工作,但是问题是,如果白名单中的列为空,那么这意味着它是一个通配符(如果有人能够提供更好的方法,可以更改此行为),这意味着该列中的任何值都被接受。在接受条目之前,所有三列都必须通过 这就是我被卡

导言

您好,我目前正在尝试构建一个基于MySQL的过滤系统,我现在遇到了一个问题,如何解决这个问题。我在下面的示例表链接中提供了两个表,一个是白名单表,其中包含白名单项目,另一个是未排序表,它是将根据白名单检查的项目列表

附:白名单在不断变化

问题

如果只是为了匹配,如果三列完全匹配,这将是一项非常简单的工作,但是问题是,如果白名单中的列为空,那么这意味着它是一个通配符(如果有人能够提供更好的方法,可以更改此行为),这意味着该列中的任何值都被接受。在接受条目之前,所有三列都必须通过

这就是我被卡住的地方=\

示例

样本表:或以下(相同内容)

白名单中有一列如下所示:[国家:空,地区:东,项目:香蕉]

这意味着,对于未排序列表中的任何条目,只要该条目是来自东部地区的香蕉,我们就接受它

另一个例子是[国家:空,地区:空,项目:空]

这意味着我们将从任何国家或地区带走任何一头驴,因为为什么不呢

预期产出

从上面的例子中,我期望列表的输出如下

[ 6, US, West Apple ]

[ 11, Null, East, Banana ]
[ 14, US, East, Banana ]
[ 17, China, East, Banana ]

[ 25, China, Null, Cat ]
[ 26, China, East, Cat ]
[ 27, China, West, Cat ]

[ 28, Null, Null, Donkey ]
[ 29, Null, East, Donkey ]
[ 30, Null, West, Donkey ]
[ 31, US, Null, Donkey ]
[ 32, US, East, Donkey ]
[ 33, US, West, Donkey ]
[ 34, China, Null, Donkey ]
[ 35, China, East, Donkey ]
[ 36, China, West, Donkey ]
编辑:回复评论

@斯隆打浆机

SELECT a.*
FROM `unsorted` a
JOIN `whitelist` b
ON IF(b.`country` IS NULL,true,a.`country` = b.`country`) AND
    IF(b.`region` IS NULL,true,a.`region` = b.`region`) AND
    IF(b.`item` IS NULL,true,a.`item` = b.`item`);

由于白名单上没有“id”列,因此where子句会导致错误,select也应该为结果选择未排序的,如果我选择表b,我只会看到筛选器,而不是我希望看到的筛选数据。

我认为可以使用
exists
子查询执行您想要的操作:

select u.*
from unsorted u
where exists (select 1
              from whitelist wl
              where (wl.country = u.country or wl.country is null) and
                    (wl.region = u.region or wl.region is null) and
                    (wl.item = u.item or wl.item is null)
             );

我认为您可以使用
exists
子查询执行您想要的操作:

select u.*
from unsorted u
where exists (select 1
              from whitelist wl
              where (wl.country = u.country or wl.country is null) and
                    (wl.region = u.region or wl.region is null) and
                    (wl.item = u.item or wl.item is null)
             );

我认为这应该符合你的要求:

SELECT
    b.*
FROM `unsorted` a
JOIN `whitelist` b
ON IF(b.`country` IS NULL,true,a.`country` = b.`country`) AND
    IF(b.`region` IS NULL,true,a.`region` = b.`region`) AND
    IF(b.`item` IS NULL,true,a.`item` = b.`item`)
WHERE NOT b.`id` IS NULL;

我认为这应该符合你的要求:

SELECT
    b.*
FROM `unsorted` a
JOIN `whitelist` b
ON IF(b.`country` IS NULL,true,a.`country` = b.`country`) AND
    IF(b.`region` IS NULL,true,a.`region` = b.`region`) AND
    IF(b.`item` IS NULL,true,a.`item` = b.`item`)
WHERE NOT b.`id` IS NULL;

下面是另一种书写方式:

SELECT a.*
FROM unsorted a JOIN whitelist b
 ON a.country <=> COALESCE(b.country, a.country)
AND a.region  <=> COALESCE(b.region, a.region)
AND a.item    <=> COALESCE(b.item, a.item)
选择一个*
从未排序的a加入白名单b
关于a.国家联合(b.国家,a.国家)
和a区域合并(b区域,a区域)
和a.项目合并(b.项目,a.项目)

与@Sloancher的答案类似的逻辑,但它使用了一些不同的逻辑运算符。

这里有另一种编写方法:

SELECT a.*
FROM unsorted a JOIN whitelist b
 ON a.country <=> COALESCE(b.country, a.country)
AND a.region  <=> COALESCE(b.region, a.region)
AND a.item    <=> COALESCE(b.item, a.item)
选择一个*
从未排序的a加入白名单b
关于a.国家联合(b.国家,a.国家)
和a区域合并(b区域,a区域)
和a.项目合并(b.项目,a.项目)

与@Sloancher的答案的逻辑相似,但它使用了一些不同的逻辑运算符。

编辑您的问题,并将样本数据以表格格式放入问题中。我没有这个选项,如果我将样本数据转储到这里,它将太长。另外,我提供的链接是一个沙盒,您可以直接开始尝试,因此我不认为将它放在这里会有任何帮助=\编辑您的问题,并将样本数据以表格格式放入问题中。我没有这个选项,如果我将样本数据转储到这里,它将太长。另外,我提供的链接是一个沙盒,您可以直接开始尝试,因此我不认为将它放在这里会有任何帮助=\n谢谢,但是,您的语法中有很多错误,我必须先修复它,但是这个解决方案在修复后效果很好,再次感谢:)修复语法错误后,您最终得到了什么?您可以编辑您的问题并发布最终有效的查询吗?谢谢,但是,您的语法中有一个相当大的错误,我必须先修复它,但是这个解决方案在修复后效果很好,再次感谢:)在修复语法错误后,您最终得到了什么?您是否可以编辑您的问题并发布最终有效的查询?它不会返回任何结果=\@威利·桑尼。“项目”不等于“国家”。
WHERE
子句中有一个拼写错误。啊,没有找到,它也很有魅力,谢谢:DIt不返回任何内容=\@威利·桑尼。“项目”不等于“国家”。
WHERE
子句中有一个拼写错误。啊,没有注意到,它也很有魅力,谢谢:D