跳至主要內容
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?

4563博客

全新的繁體中文 WordPress 網站
  • 首頁
  • SQL 问题请教(mysql)
未分類
23 8 月 2020

SQL 问题请教(mysql)

SQL 问题请教(mysql)

資深大佬 : CUMTProgrammer 11

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.如果没有的话,哪一种稍微好一点

大佬有話說 (13)

  • 資深大佬 : youzipi

    没必要 join 两次吧

  • 資深大佬 : luojianxhlxt

    为啥要 join 两次呀
    虽然我都是 a.status =c.id(+)这么写

    这两个来说,第一个好吧

  • 主 資深大佬 : CUMTProgrammer

    @luojianxhlxt
    @youzipi
    如果 join 一次的话,后面的 type 要怎么查询?能否写一下完整的 sql
    两个属性并不是一行数据,type 是一行,status 是一行,是字典表的形式

  • 主 資深大佬 : CUMTProgrammer

    如果是查询一行的话,我也觉得 join 要好,但是这个是 a 的多个属性都要从 b 获取,可以简单的理解 b 只有 id,name 两个字段,a 存着 b 的 id

  • 資深大佬 : bixchen

    第一种。

  • 資深大佬 : redtea

    把字典表全表查出来,写入缓存,等有数据更新了再更新缓存。
    只要查询 a 表就行了,status 和 type 对应的名称从缓存查。
    如果字典表常年不变的话,作为常量都行。

  • 資深大佬 : justgodlike1993

    WHERE a.type = c.id?

  • 資深大佬 : lovecy

    #6 正解,非要 SQL 就第一种了,别纠结了,头发要紧

  • 資深大佬 : realpg

    从语义逻辑上看也是 left join 没啥性能问题

  • 資深大佬 : guanhui07

    我也觉得 一次 join

  • 資深大佬 : taogen

    1. 应该没有。
    2. 习惯第一种写法。

  • 資深大佬 : zhangysh1995

    个人觉得第二种更优雅。a.type, a.id, b.id 如果有索引,支持第二种,速度应该会更快。

    第一种的话 left join 一次就好, `xxx on a.status = b.id and a.type = b.id`, 需要加索引 (status, type), 注意 predicate 顺序

  • 主 資深大佬 : CUMTProgrammer

    @zhangysh1995 兄弟,你的 join 一次写法太想当然了。你可以自己试一次

文章導覽

上一篇文章
下一篇文章

AD

其他操作

  • 登入
  • 訂閱網站內容的資訊提供
  • 訂閱留言的資訊提供
  • WordPress.org 台灣繁體中文

51la

4563博客

全新的繁體中文 WordPress 網站
返回頂端
本站採用 WordPress 建置 | 佈景主題採用 GretaThemes 所設計的 Memory
4563博客
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?
在這裡新增小工具