如何 SELECT none 匹配行从一个 table 到另一个?
How to SELECT none matching rows from one table to another?
Mysql v5.7
我知道之前有人问过这个问题并回答过这个问题,但一般查询在我的数据库中不起作用,我把我的头发拉下来了。
我有两个 tables,只有一列包含电子邮件:1) 已发送(41110 行 [有重复项])2) 块(81132 [有重复项])
mysql> show create table blocks;
+--------+------------------------------------------------------------------------------------------------+
| Table | Create Table |
+--------+------------------------------------------------------------------------------------------------+
| blocks | CREATE TABLE `blocks` (
`email` varchar(200) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
+--------+------------------------------------------------------------------------------------------------+
mysql> show create table sent;
+-------+-----------------------------------------------------------------------------------------------+
| Table | Create Table |
+-------+-----------------------------------------------------------------------------------------------+
| sent | CREATE TABLE `sent` (
`emails` varchar(111) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
+-------+-----------------------------------------------------------------------------------------------+
我想获取行作为 "Sent" - "Blocks" 或
我想从 "Sent" table 中获取那些不在 "Blocks" table
中的行
已发送table:
mysql> select * from sent limit 10;
+-----------------------------------------------------+
| emails |
+-----------------------------------------------------+
| "52@mail.marketplace" |
| "1cstains@coden.com" |
| "a.aldhizer@ldplastics.com" |
| "a.antosca@tdx.com" |
| "a.balvanz@hrrd-paper.com" |
| "a.bandal@medpace.com" |
| "a.bass@paettethanol.com" |
| "a.bodwalk@bedfndustries.com" |
| "a.bravo@sdfhemie.com" |
| "a.burton@evdarenterprises.com" |
+-----------------------------------------------------+
10 rows in set (0.00 sec)
块
mysql> select * from blocks limit 10;
+---------------------------------------------------+
| email |
+---------------------------------------------------+
| "" |
| 0f6a88be0a4b45628be38ae08c8fdd71@mail.marketplace |
| 1cstains@coden.com |
| 1cstains@coden.com |
| 1cstains@coden.com |
| 3161foodmgr@mcare.com |
| 4b00fce87e5b423c942f5b19f27c3a13@mail.marketplace |
| 52d05d98b59e44b0816401d2cd0411f0@mail.marketplace |
| 52d05d98b59e44b0816401d2cd0411f0@mail.marketplace |
| 6357a2fd35114418a93e0ccda6edd6f4@mail.marketplace |
+---------------------------------------------------+
10 rows in set (0.00 sec)
发送的预期结果table
+-----------------------------------------------------+
| emails |
+-----------------------------------------------------+
| "52@mail.marketplace" |
| "a.aldhizer@ldplastics.com" |
| "a.antosca@tdx.com" |
| "a.balvanz@hrrd-paper.com" |
| "a.bandal@medpace.com" |
| "a.bass@paettethanol.com" |
| "a.bodwalk@bedfndustries.com" |
| "a.bravo@sdfhemie.com" |
| "a.burton@evdarenterprises.com" |
+-----------------------------------------------------+
这是我使用的查询,它 returns 匹配行 :/
select sent.emails from sent where sent.emails NOT IN ( select email from blocks )
请使用minus运算符。
select sent.emails from sent
minus
select blocks.email from blocks
select sent.emails
from sent
left join blocks on sent.emails = blocks.email
where blocks.email is null
如果问题是电子邮件中的 "
个字符(正如提到的 @Jens),您可以更改连接以使用 subbstring 跳过第一个和最后一个字符
来剪切 "
个字符
left join blocks on SUBSTRING(sent.emails,1,len(sent.emails)-2) = blocks.email
Mysql v5.7 我知道之前有人问过这个问题并回答过这个问题,但一般查询在我的数据库中不起作用,我把我的头发拉下来了。 我有两个 tables,只有一列包含电子邮件:1) 已发送(41110 行 [有重复项])2) 块(81132 [有重复项])
mysql> show create table blocks;
+--------+------------------------------------------------------------------------------------------------+
| Table | Create Table |
+--------+------------------------------------------------------------------------------------------------+
| blocks | CREATE TABLE `blocks` (
`email` varchar(200) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
+--------+------------------------------------------------------------------------------------------------+
mysql> show create table sent;
+-------+-----------------------------------------------------------------------------------------------+
| Table | Create Table |
+-------+-----------------------------------------------------------------------------------------------+
| sent | CREATE TABLE `sent` (
`emails` varchar(111) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
+-------+-----------------------------------------------------------------------------------------------+
我想获取行作为 "Sent" - "Blocks" 或 我想从 "Sent" table 中获取那些不在 "Blocks" table
中的行已发送table:
mysql> select * from sent limit 10;
+-----------------------------------------------------+
| emails |
+-----------------------------------------------------+
| "52@mail.marketplace" |
| "1cstains@coden.com" |
| "a.aldhizer@ldplastics.com" |
| "a.antosca@tdx.com" |
| "a.balvanz@hrrd-paper.com" |
| "a.bandal@medpace.com" |
| "a.bass@paettethanol.com" |
| "a.bodwalk@bedfndustries.com" |
| "a.bravo@sdfhemie.com" |
| "a.burton@evdarenterprises.com" |
+-----------------------------------------------------+
10 rows in set (0.00 sec)
块
mysql> select * from blocks limit 10;
+---------------------------------------------------+
| email |
+---------------------------------------------------+
| "" |
| 0f6a88be0a4b45628be38ae08c8fdd71@mail.marketplace |
| 1cstains@coden.com |
| 1cstains@coden.com |
| 1cstains@coden.com |
| 3161foodmgr@mcare.com |
| 4b00fce87e5b423c942f5b19f27c3a13@mail.marketplace |
| 52d05d98b59e44b0816401d2cd0411f0@mail.marketplace |
| 52d05d98b59e44b0816401d2cd0411f0@mail.marketplace |
| 6357a2fd35114418a93e0ccda6edd6f4@mail.marketplace |
+---------------------------------------------------+
10 rows in set (0.00 sec)
发送的预期结果table
+-----------------------------------------------------+
| emails |
+-----------------------------------------------------+
| "52@mail.marketplace" |
| "a.aldhizer@ldplastics.com" |
| "a.antosca@tdx.com" |
| "a.balvanz@hrrd-paper.com" |
| "a.bandal@medpace.com" |
| "a.bass@paettethanol.com" |
| "a.bodwalk@bedfndustries.com" |
| "a.bravo@sdfhemie.com" |
| "a.burton@evdarenterprises.com" |
+-----------------------------------------------------+
这是我使用的查询,它 returns 匹配行 :/
select sent.emails from sent where sent.emails NOT IN ( select email from blocks )
请使用minus运算符。
select sent.emails from sent
minus
select blocks.email from blocks
select sent.emails
from sent
left join blocks on sent.emails = blocks.email
where blocks.email is null
如果问题是电子邮件中的 "
个字符(正如提到的 @Jens),您可以更改连接以使用 subbstring 跳过第一个和最后一个字符
"
个字符
left join blocks on SUBSTRING(sent.emails,1,len(sent.emails)-2) = blocks.email