SQL 问题请教(mysql)

2020-08-26 17:22:32 +08:00
 CUMTProgrammer

select a.id, c.name as status ,d.name as type 
from a 
left join b c on a.status =c.id
left join b d on a.type =d.id

select a.id,
(selct name from b where a.status = b.id) as status,
(selct name from b where a.type = b.id) as type
from a

a 表与 b 表关联,b 作为字典表,存着名称等信息,a 只有 id 。

不讨论这个表结构改变等等(以及用了很久,数据很多,而且不是我能决定的),仅从 SQL 角度

1.两种写法我都觉得很丑陋,有没有更好的

2.如果没有的话,哪一种稍微好一点

2522 次点击
所在节点    MySQL
14 条回复
youzipi
2020-08-26 17:30:34 +08:00
没必要 join 两次吧
luojianxhlxt
2020-08-26 17:32:33 +08:00
为啥要 join 两次呀
虽然我都是 a.status =c.id(+)这么写

这两个来说,第一个好吧
CUMTProgrammer
2020-08-26 17:55:59 +08:00
@luojianxhlxt
@youzipi
如果 join 一次的话,后面的 type 要怎么查询?能否写一下完整的 sql
两个属性并不是一行数据,type 是一行,status 是一行,是字典表的形式
CUMTProgrammer
2020-08-26 17:57:44 +08:00
如果是查询一行的话,我也觉得 join 要好,但是这个是 a 的多个属性都要从 b 获取,可以简单的理解 b 只有 id,name 两个字段,a 存着 b 的 id
bixchen
2020-08-26 17:59:07 +08:00
第一种。
redtea
2020-08-26 18:18:47 +08:00
把字典表全表查出来,写入缓存,等有数据更新了再更新缓存。
只要查询 a 表就行了,status 和 type 对应的名称从缓存查。
如果字典表常年不变的话,作为常量都行。
justgodlike1993
2020-08-26 19:08:45 +08:00
WHERE a.type = c.id?
lovecy
2020-08-26 19:28:52 +08:00
#6 正解,非要 SQL 就第一种了,别纠结了,头发要紧
realpg
2020-08-26 19:32:57 +08:00
从语义逻辑上看也是 left join 没啥性能问题
guanhui07
2020-08-26 19:48:51 +08:00
我也觉得 一次 join
taogen
2020-08-26 20:42:19 +08:00
1. 应该没有。
2. 习惯第一种写法。
zhangysh1995
2020-08-28 15:40:16 +08:00
个人觉得第二种更优雅。a.type, a.id, b.id 如果有索引,支持第二种,速度应该会更快。

第一种的话 left join 一次就好, `xxx on a.status = b.id and a.type = b.id`, 需要加索引 (status, type), 注意 predicate 顺序
CUMTProgrammer
2020-08-28 17:02:58 +08:00
@zhangysh1995 兄弟,你的 join 一次写法太想当然了。你可以自己试一次
jintianfengda
2020-08-31 18:01:06 +08:00
字典表放缓存吧,如果非要从 db 查,那就第一种吧,我还是习惯了用 join
针对 join 一次还是 join 两次的问题,应该是 join 两次,b 是字典表,a 是两个字段需要去查字典,我这么理解没错吧
还有字典一般都是 Map<K,List<V>>两层结构的吧,这里直接 join 了 id 的话那就应该是单层的了,对我个人来说也怪怪的

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

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

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

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

© 2021 V2EX