SQL 问题

kkobebryant 2010-11-25 08:20:34
表1 :table1
id name
1 A
2 B
3 C
4 D


表1明细表: table1_detail

table1ID decription period amount
1 PPPP 2008 22
2 CCCC 2008 33
4 RRRR 2009 44

请问怎么样才可以 将表1的所有记录都列出来,而period是等于 2008的 amount数量 ,如果2008无数量显示为0 ?

select name,ifnull(amount,0) from table1 t left join table1_detail tb on t.id=tb.table1ID where tb.period='2008'
这样写 id=3和 id=4 不会显示

select name,ifnull(amount,0) from table1 t left join table1_detail tb on t.id=tb.table1ID where tb.period='2008' or tb.period is null
这样写 id=4 会不显示



我要的结果是

name amount
A 22
B 33
C 0
D 0

...全文
57 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
zuoxingyu 2010-11-26
  • 打赏
  • 举报
回复
[Quote=引用楼主 kkobebryant 的回复:]
select name,ifnull(amount,0) from table1 t left join table1_detail tb on t.id=tb.table1ID where tb.period='2008'
这样写 id=3和 id=4 不会显示

select name,ifnull(amount,0) from table1 t left join table1_detail tb on t.id=tb.table1ID where tb.period='2008' or tb.period is null
这样写 id=4 会不显示
[/Quote]

解释下为什么你会得到这样的结果。
1:select name,ifnull(amount,0) from table1 t left join table1_detail tb on t.id=tb.table1ID where tb.period='2008'
这句话是先查出所有的记录,用左链接的方式,如同SELECT * FROM TABLE1......。得到一个记录集后,再用IFNULL去替换AMOUNT值,然后再把PERIOD=2008的挑出来。

第二个问题类似,也是最后去挑选2008的记录,导致查询结果不对。

正确的写法在计算AMOUNT值的时候,就带上2008的条件了,而不是结果集生产后,再用2008去选择。
zuoxingyu 2010-11-26
  • 打赏
  • 举报
回复
mysql> select name,if(period=2008,amount,0) from table1 a left join table1_detail b on a.id=b.table1id
-> ;
+------+--------------------------+
| name | if(period=2008,amount,0) |
+------+--------------------------+
| A | 22 |
| B | 33 |
| C | 0 |
| D | 0 |
+------+--------------------------+
4 rows in set (0.00 sec)

mysql>
WWWWA 2010-11-26
  • 打赏
  • 举报
回复
select name,if(period=2008,amount,0) from table1 t left join table1_detail tb on t.id=tb.table1ID

or

select name,COALESCE(sa,0) from table1 a left join
(select table1ID,sum(amount) as sa from table1_detail where period='2008' group by table1ID) b
on a.id=b.table1ID
lxq19851204 2010-11-25
  • 打赏
  • 举报
回复
小小小小周 2010-11-25
  • 打赏
  • 举报
回复
select name,if(period=2008,amount,0) from table1 t  left join table1_detail tb on t.id=tb.table1ID 
ACMAIN_CHM 2010-11-25
  • 打赏
  • 举报
回复
select a.name,ifnull(amount,0)
from table1 a Left Join (select table1ID,amount FROM table1_detail Where period='2008' ) b ON a.id=b.table1ID
通过慢sql分析的学习,了解什么是慢sql,以及慢SQL会引起那些性能问题。清楚慢sql日志的设置,然后再通过慢sql分析工具的学习,清楚慢sql分析的步骤和流程。慢sql分析工具:mysqldumpslow工具、explain工具、profile工具、Optimizer Trace工具。 提供课程中所使用的sql语句。 课程内容:第一章:课程简介1、课程介绍2、课程大纲 第二章:慢sql简介1、慢sql简介2、慢sql会引起的问题 第三章:慢日志的设置1、慢sql的分析流程2、慢日志参数理解3、慢日志参数设置:第1种方式:my.ini文件设置4、慢日志参数设置:第2种方式:sql脚本设置5、慢日志参数设置-效果验证 第四章:如何发现慢sql1、如何发现慢sql:第1种方式:慢日志文件2、如何发现慢sql:第2种方式:mysql库的slow_log表 第五章:慢sql分析工具1、慢sql提取-mysqldumpslow工具-使用方法2、慢sql提取-mysqldumpslow工具-操作实战3、慢sql的执行计划分析-explain分析-执行计划结果说明4、慢sql的执行计划分析-explain分析-索引介绍+type类型举例5、慢sql的资源开销分析-profile分析-分析步骤6、慢sql的资源开销分析-profile分析-show profile执行阶段说明7、慢sql的资源开销分析-profile分析-完整列表说明+操作实战8、慢sql的跟踪分析-Optimizer Trace分析-分析步骤9、慢sql的跟踪分析-Optimizer Trace表的介绍10、索引失效场景举例 第六章:慢日志清理1、慢日志清理

56,677

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧