4

たとえば、テーブルAとテーブルBがあります

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

a.data または b.data で 1 つの値を検索する場合は、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}
4

3 に答える 3

4

を使用してテーブルの相互作用を取ることができますINNER JOIN

結合の視覚的な説明をご覧ください

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

また、ユーザー定義関数を次のように記述することもできます。

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;
于 2012-07-26T13:31:01.340 に答える
1

列のタイプがである場合、その列はSET内部で数値として格納され、必要に応じてその数値に自動変換されます。説明する演算は、これらの数値に対するビット単位の論理演算に対応しています。たとえば、交差は、ビット単位と2つの列の値を使用して計算できます。

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

これには、両方の列のタイプが同じである必要があります。これにより、同じ文字列が同じビットに対応します。結果を文字列に戻すには、を使用できますELTが、すべての組み合わせで醜くなる可能性があります。別の方法として、結果を同じデータ型の一時テーブルに保存し、数値として保存し、後で文字列として取得することもできます。

于 2012-07-26T13:40:31.963 に答える
1

内部結合から交差を取得します。

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

b が a のサブセットであるかどうかを判断するには、次のようにします。

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

これは差を計算します: a に含まれないb からのすべての値。空の場合、b は a のサブセットです。

これらのアプローチは両方とも、より大きなクエリ内のサブクエリとして使用できます。

于 2012-07-26T13:26:38.807 に答える