请教一个 SQL 语句的问题

2020-02-05 12:27:20 +08:00
 xudzhang

有一个 MySQL 的表,结构是这样的:

a b

a1 b1

a2 b2

a2 b3

其中 a-b 是 1-N 的关系。现在给定一堆 b,要求返回所有 b 对应的 a 的所有记录。一种实现方式是:

SELECT * FROM table WHERE a IN (SELECT a FROM table WHERE b IN ('b1', 'b2', 'b3'));

请教一下,有没有更高效的语句?

2941 次点击
所在节点    MySQL
5 条回复
sunnyadamm
2020-02-05 12:31:50 +08:00
left join
saulshao
2020-02-05 16:02:29 +08:00
这个看起来没有了,left join 最后给你的变化也就是个写法上的差异,现代关系数据库优化后和你写的这个子查询基本没差异。
这个限制在于后面那个 in 里面如果是常量,可能会由于列表增加而导致 SQL 语句长度超长....
yeyu1989
2020-02-05 16:35:41 +08:00
说的不是很清楚啊
如果是一张表,用 distinct 就行
如果是两张表,用 exists 理论上更快
Codelike
2020-02-06 03:20:31 +08:00
你说的应该是一张表,直接用 distinct。至于 sql 语句过长的问题,可以在 service 层进行分批处理,然后用 set 汇总。
CRVV
2020-02-06 11:31:15 +08:00
楼主描述的问题和给出的 SQL 不是同一个问题

如果表里的数据是
a1 b1
a2 b2
a2 b3
a2 b4

SQL 返回的是
a1 b1
a2 b2
a2 b3
a2 b4

但是看描述应该返回
a1
a2

如果把 SQL 的开头改成 SELECT a FROM ......
结果是
a1
a2
a2
a2

还有一种你可能想要的结果是
a1
a2
a2

还有一种你可能想要的结果是
a1 b1
a2 b2
a2 b3

所以请问楼主,你到底要哪一种结果?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/642250

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX