检查一组整数是否是另一组整数的子集

时间:2014-07-29 12:19:45

标签: mysql mariadb

使用至少涵盖MySQL 5.5中所有可用功能的MariaDB 5.5,如何确定一组整数是否是另一个整数子集的子集?

在其他编程(非数据库)语言中,有人(例如Java)

Set<Integer> innerSet = new HashSet<>(Arrays.asList(1001, 1003));
Set<Integer> outerSet = new HashSet<>(Arrays.asList(1001, 1003, 1005));
return outerSet.containsAll(innerSet);

更加非正式的表示法:

innerSet = {1001, 1003}
outerSet = {1001, 1003, 1005}
return (innerSet is-subset-of outerSet)

请注意,内部集合和外部集合概念的值不应该是硬编码的。

如何使用MariaDB 5.5实现相同的目标?

伪SQL中的一个示例,注意(..., ...)也保留用于表示列:

SELECT {1001, 1003} SUBSET-OF {1001, 1003, 1005};

SELECT IS_SUBSET_OF({1001, 1003}, {1001, 1003, 1005});

2 个答案:

答案 0 :(得分:1)

任何特殊原因

SELECT (COUNT(tableA.column) = COUNT(tableB.column)) FROM tableA LEFT JOIN tableB ON tableA.column = tableB.column

不行吗?您必须在数据库列中同时拥有这两个集。

没有桌子,我能想到的一个令人讨厌的方法就是这样做:

SELECT (COUNT(tableA.a) = COUNT(tableB.b)) FROM ( SELECT 10 as a UNION SELECT 20 ) as tableA LEFT JOIN ( SELECT 10 as b UNION SELECT 20 UNION SELECT 30 ) as tableB ON tableA.a = tableB.b

答案 1 :(得分:1)

这可以通过先将数据放入临时表,然后对其执行查询来完成,例如:

DROP TEMPORARY TABLE inner_set;
DROP TEMPORARY TABLE outer_set;

CREATE TEMPORARY TABLE inner_set
(value INT(11) NOT NULL, INDEX(value));
CREATE TEMPORARY TABLE outer_set
(value INT(11) NOT NULL, INDEX(value));

INSERT INTO inner_set (value) VALUES (1001), (1003);
INSERT INTO outer_set (value) VALUES (1001), (1003), (1005);

SELECT 
  CASE 
    WHEN COUNT(*) > 0 THEN 0
    ELSE 1
  END AS is_subset_of
FROM inner_set
LEFT JOIN outer_set ON inner_set.value = outer_set.value
WHERE outer_set.value  IS NULL

这里的诀窍是,inner_setouter_set的加入会为NULL生成outer_set值,然后您可以计算这些值并返回{{1} }或0取决于它是否是一个子集。