2012-07-26 54 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