首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >左连接的排序子句

问左连接的排序子句
EN

Stack Overflow用户
提问于 2016-09-13 23:12:10
回答 2查看 31关注 0票数 0

我正在尝试使用如下所示的查询来联接一些表。因为我想理想地得到b表引用的c.name。如果b表在结果集中没有行,或者b行没有引用c,那么只需获取表引用的c.name。

代码语言:javascript
复制
SELECT a.*, c.name
FROM a
LEFT JOIN b ON a.b_id = b.id
LEFT JOIN c ON (b.c_id IS NOT NULL AND b.c_id = c.id) OR a.c_id = c.id

然而,mysql总是把c和a.c_id = c.id结合起来,得到不太受欢迎的c.name。有没有可能避免这种情况,或者mySQL正在试图尽可能快地获得完整的结果集?

EN

回答 2

Stack Overflow用户

发布于 2016-09-13 23:21:09

我认为这应该会有帮助:

代码语言:javascript
复制
SELECT a.*, c.name
FROM a
LEFT JOIN b ON a.b_id = b.id
LEFT JOIN c ON c.id = COALESCE(b.c_id, a.c_id)

当b.c_id为NULL时,将使用a.c_id。否则将使用b.c_id。

这与速度无关。OR将为您提供所有可能的结果行,包括a中每一行的b.c_id和a.c_id映射。

如果您不熟悉COALESCE(),那么它的长形式与您的查询几乎完全相同,只是使用了IF()而不是OR。

代码语言:javascript
复制
SELECT a.*, c.name
FROM a
LEFT JOIN b ON a.b_id = b.id
LEFT JOIN c ON IF(b.c_id IS NOT NULL, b.c_id = c.id, a.c_id = c.id)
票数 0
EN

Stack Overflow用户

发布于 2016-09-13 23:26:24

试试这个可能会有帮助:

代码语言:javascript
复制
SELECT a.*, c.name
FROM a
LEFT JOIN b ON a.b_id = b.id
LEFT JOIN c ON (b.c_id IS NOT NULL OR b.c_id = c.id) OR a.c_id = c.id
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39473460

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档