Mysql SQL:;不在「;根据*不同*行的值选择行的备选方案?

Mysql SQL:;不在「;根据*不同*行的值选择行的备选方案?,mysql,performance,subquery,Mysql,Performance,Subquery,如何生成一个SQL语句来返回由子查询、连接或处理您试图返回的信息的其他内容修改的结果 例如: CREATE TABLE bowlers ( bowling_id int4 not null primary key auto_increment, name text, team text ); 可能有人错误地加入了多个团队: INSERT INTO `bowlers` (`name`, `team`) VALUES ('homer', 'pin pals'), ('moe', 'pin pals

如何生成一个SQL语句来返回由子查询、连接或处理您试图返回的信息的其他内容修改的结果

例如:

CREATE TABLE bowlers (
bowling_id int4 not null primary key auto_increment,
name text,
team text
);
可能有人错误地加入了多个团队:

INSERT INTO `bowlers` (`name`, `team`) VALUES
('homer', 'pin pals'),
('moe', 'pin pals'),
('carl', 'pin pals'),
('lenny', 'pin pals'),
('homer', 'The homer team'),
('bart', 'The homer team'),
('maggie', 'The homer team'),
('lisa', 'The homer team'),
('marge', 'The homer team'),
('that weird french guy', 'The homer team');
所以荷马不能决定他的球队,所以他两全其美。不要

我想知道每一个参加荷马队的人,谁不参加《密码》乐队。我所能做的就是:

SELECT a.name, a.team 
    FROM bowlers a where a.team = 'The homer team' 
    AND a.name 
    NOT IN (SELECT b.name FROM bowlers b WHERE b.team = 'pin pals');
导致:

+-----------------------+----------------+
| name                  | team           |
+-----------------------+----------------+
| bart                  | The homer team | 
| maggie                | The homer team | 
| lisa                  | The homer team | 
| marge                 | The homer team | 
| that weird french guy | The homer team | 
+-----------------------+----------------+
5 rows in set (0.00 sec)
你知道,这太棒了

性能将受到影响,因为子查询将针对查询的每个结果运行,即B到A到D。对于几行来说很好,对于几十万行来说非常糟糕

什么是更好的方法?我主要是在想一个自我加入可以达到目的,但我不知道该怎么做

没有使用,
notin(选择…)


另外,这类问题的名称是什么?

您可以
左联接
,并确保联接的表中没有数据(所有内容都为空)

像这样:

SELECT a.name, a.team
FROM bowlers a
LEFT OUTER JOIN bowlers b ON a.name = b.name AND b.team = 'pin pals'
WHERE a.team = 'The homer team'
AND b.name IS NULL;
您也可以这样做:

SELECT a.name, a.team
FROM bowlers a
WHERE a.team = 'The homer team'
AND NOT EXISTS (SELECT * FROM bowlers b
    WHERE b.team = 'pin pals'
    AND a.name = b.name
    );

顺便说一下,这被称为“左反半联接”。

左外联接返回到您自己就是您想要的。这确实有效,但它是否比他的子查询更高效?连接的开销似乎会更大,但我不知道。这在很大程度上取决于表结构、可用的索引、表中的行数等、团队A或团队B中的人数等。太棒了!你的第一个例子肯定是对我问题的改进。仍然运行有点慢(MySQL版本5.0.37),但有一些。。。好吧,至少现在它回来了!谢谢你用(左反半联接)这个术语来解释这一点
SELECT a.name, a.team
FROM bowlers a
WHERE a.team = 'The homer team'
AND NOT EXISTS (SELECT * FROM bowlers b
    WHERE b.team = 'pin pals'
    AND a.name = b.name
    );