代码之家  ›  专栏  ›  技术社区  ›  Francesco

mysql:选择表中匹配组合和相反组合的所有行

  •  1
  • Francesco  · 技术社区  · 8 年前

    我的桌子像这样

    ID - col1 - col2
    =====================
    1  - 115  -  3
    2  - 3    -  115
    3  - 110  -  121
    4  - 12   -  115
    5  - 115  -  121
    6  - 115  -  65
    

    我想选择所有行的位置 col1 = 115 它将输出一个所有行匹配的简单表115 所以我做了

    SELECT * from myTable WHERE col1= 115
    

    这是最简单的部分。现在,同时,我需要以某种方式标记所有匹配相反值的行 在这种情况下`

    3和115,假设也存在115和3

    不是说我不会“标记”12 115因为115 12不存在

    所需输出应为

    ID - col1 - col2 - mark
    ========================
    1  - 115  -  3   - true
    5  - 115  -  121 - false
    6  - 115  -  65  - false
    

    我希望我能说清楚… `

    1 回复  |  直到 8 年前
        1
  •  2
  •   SeanW333    8 年前

    您需要将表连接到它本身,称为“自连接”。查询返回表的第一个实例中的所有数据,但只联接与第一个实例相反的第二个实例中的记录。因此,如果存在反向匹配,则所有联接列中都会有数据,如果没有反向匹配,则id、col1和col2将在联接列上返回空数据。然后,使用“if”语句在联接的数据上查找空值)。见以下代码:

    SELECT
        nt1.ID,
        nt1.col1,
        nt1.col2,
        if(ID.col1 IS NULL, 'False', 'True') AS `Mark`
    FROM
        new_test AS nt1
    LEFT OUTER JOIN
        new_test AS nt2
        ON
        (
        nt1.col1 = nt2.col2
        AND
        nt1.col2 = nt2.col1
        )
    WHERE 
        nt1.col1 = 115;
    

    请注意,我们将col1与join中的col2进行匹配,这将使您得到相反的数字。

    用于设置测试的代码:

    DROP TABLE IF EXISTS new_test;
    CREATE TABLE IF NOT EXISTS new_test (
        id int not null,
        col1 int,
        col2 int
    );
    
    
    INSERT INTO new_test (ID, col1, col2) 
        VALUES
            (1,115,3),
            (2,3,115),
            (3,110,121),
            (4,12,115),
            (5,115,121),
            (6,115,65);