繁体   English   中英

帮助编写SQL查询

[英]help writing sql query

我有一个数据库,看起来像:

往来

id | name
1  | bob
2  | jack
3  | jill

contactsGroupLink

cId| gId
1  | 1
2  | 3
2  | 3
2  | 5
3  | 4

所以基本上

联系人通过contactsGroupLink表中的条目链接到组。

一个联系人可以在多个组中,但是一个联系人只能在一个组中一次。

我要写的查询是

select `name` 
  from contacts 
 where contact.id not in (select contactId 
                           from contactsGroupLink 
                          where groupId = 5);

哪个有效。 它返回bobjill

但是,由于它有一个依赖的子查询,因此优化程度不是很高。 谁能帮助优化它?

因为两个列都不太可能为NULL,所以在MySQL( )中,最好的选择是使用LEFT JOIN / IS NULL

   SELECT c.name
     FROM CONTACTS c
LEFT JOIN CONTACTSGROUPLINK cgl ON cgl.contactid = c.id
                               AND cgl.groupid = 5
    WHERE cgl.contactid IS NULL

如果列是可空的 ,则NOT EXISTS是更好的选择:

   SELECT c.name
     FROM CONTACTS c
    WHERE NOT EXISTS (SELECT NULL
                        FROM CONTACTSGROUPLINK cgl
                       WHERE cgl.contactid = c.id
                         AND cgl.groupid = 5)

CONTACTSGROUPLINK表中的两列应该是主键,它将自动索引这些列(从〜5.0开始?)。 否则,请确保对列进行索引。

...

where not exists (
  select 1 from contactsGroupLink cgl
  where cgl.contactid = contact.id and cgl.groupid = 5
)

这应该通过您已经拥有的contactsGroupLink(contactid,groupid)有效地使用索引。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM