![](/img/trans.png)
[英]Mysql select all rows from table1 and matching rows from table2 or return null
[英]MYSQL: select all rows from table matching a combination and the opposite
我的桌子看起来像这样
ID - col1 - col2
=====================
1 - 115 - 3
2 - 3 - 115
3 - 110 - 121
4 - 12 - 115
5 - 115 - 121
6 - 115 - 65
我想选择所有行WHERE 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
我希望我能说清楚...
您需要将表自身连接起来,称为“自我连接”。 该查询返回表的第一个实例的所有数据,但仅联接第二个实例中与第一个实例相反的记录。 因此,在存在反向匹配的地方,所有联接的列中都会有数据,而在没有反向匹配的地方,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与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);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.