2012-07-26 51 views
3

例如相交我有表A和表乙如何获得两列

a.data = {1,2,3,4,5,6} b.data = {4,5 ,7}

如果您想在a.data或b.data中查找一个值,可以使用FIND_IN_SET(3,b.data)。 但我想知道是否在至少 b.data的所有值都在a.data中,否则如果我能找到 至少b.data和a.data之间的交集。所以在这种情况下{4,5}。

WHERE INTERSECT(a.data,b.data)......类似的东西。我应该如何在MySQL中做到这一点?

更新

的b.data {4,5,7}是一个1记录的列数据,对b.data不会工作,从而接合a.data。

table A 
======= 
ID  DATA 
1  {1,2,3,4,5,6} 
2  {7,9,12} 

table B 
======= 
ID  DATA 
1  {4,5,7} 
2  {9,10,11,12} 
+0

我更新了我的帖子,试试吧。 – Omesh 2012-07-26 13:45:52

回答

3

可以使用INNER JOIN

看看Visual explaination of joins

SELECT fn_intersect_string(a.data, b.data) AS result FROM table_name; 

你也可以写一个用户定义函数取表的interection:如果你的列是

CREATE FUNCTION fn_intersect_string(arg_str1 VARCHAR(255), arg_str2 VARCHAR(255)) 
RETURNS VARCHAR(255) 
BEGIN 
    SET arg_str1 = CONCAT(arg_str1, ","); 
    SET @var_result = ""; 

    WHILE(INSTR(arg_str1, ",") > 0) 
    DO 
     SET @var_val = SUBSTRING_INDEX(arg_str1, ",", 1); 
     SET arg_str1 = SUBSTRING(arg_str1, INSTR(arg_str1, ",") + 1); 

     IF(FIND_IN_SET(@var_val, arg_str2) > 0) 
     THEN 
      SET @var_result = CONCAT(@var_result, @var_val, ","); 
     END IF; 
    END WHILE; 

    RETURN TRIM(BOTH "," FROM @var_result); 
END; 
+0

谢谢!这是我正在寻找的。 – Niborb 2012-07-26 13:57:01

1

你从内交叉口加入:

SELECT a.data FROM a, b WHERE a.data = b.data 

要决定B是否是的一个子集,你可以做

SELECT b.data FROM b LEFT JOIN a ON a.data = b.data WHERE a.data IS NULL 

这将计算的区别:所有来自b的值是而不是包含在a中。如果它是空的,那么b是a的一个子集。

您可以将这两种方法用作较大查询中的子查询。

+0

我更新了问题。 JOINS不是我正在寻找的。 – Niborb 2012-07-26 13:37:39

+0

@Niborb:尽管对MySQL中的集合有一个基本的支持,但由于它违背了[第一范式](http://en.wikipedia.org/wiki/First_normal_form)的要求,所以它的广泛使用是令人沮丧的。您可能想要更改数据库的模式,以将这些类似于列的列归入单独的表中。这将打开许多强大的处理选项,目前将拒绝给你,上述加入其中。 – MvG 2012-07-26 13:43:22

+0

我知道,但这是一个特例,我需要这个功能。 – Niborb 2012-07-26 13:53:40

1

键入SET,然后将其作为内部数字进行存储,并在适当情况下自动转换为该数字。您所描述的操作对应于这些编号的按位逻辑操作。例如,可以使用来自两列的值计算交点。

a.data & b.data AS intersection, 
(a.data & b.data) <> 0 AS aAndBIntersect, 
(a.data & b.data) == b.data AS bIsSubsetOfA 

这要求两列的类型相同,以便相同的字符串对应相同的位。要将结果重新转换为字符串,您可以使用ELT,但所有组合可能会变得很难看。或者,您可以将结果保存在具有相同数据类型的临时表中,将其存储为数字,稍后将其作为字符串进行检索。

+0

thx这个答案,但在我的情况下列不是类型设置。 – Niborb 2012-07-26 13:52:37