<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></title> 
<link>http://www.jackxiang.com/index.php</link> 
<description><![CDATA[赢在IT，Playin' with IT,Focus on Killer Application,Marketing Meets Technology.]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></copyright>
<item>
<link>http://www.jackxiang.com/post/4936/</link>
<title><![CDATA[[实践Ok]mysql关联left join条件on和where条件的区别及结合coalesce函数及adddate函数的用法]]></title> 
<author>jack &lt;xdy108@126.com&gt;</author>
<category><![CDATA[WEB2.0]]></category>
<pubDate>Tue, 31 Jan 2012 09:07:37 +0000</pubDate> 
<guid>http://www.jackxiang.com/post/4936/</guid> 
<description>
<![CDATA[ 
	[实践Ok]mysql关联left join条件on和where条件的区别及结合coalesce函数及adddate函数的用法，这儿不是介绍left join 或者right join的区别，是一个where 中的in和left 中的in在gourp by时的区别问题。<br/>主要是对这两篇文章的一介总结：<br/>[实践常用]Mysql时间加减ADDDATE函数用法： http://jackxiang.com/post/4935/<br/>[实践用到]mysql coalesce的函数用法&nbsp;&nbsp;&nbsp;&nbsp;：http://jackxiang.com/post/4934/<br/>注意：部分来自网路上，Url：http://blog.sina.com.cn/s/blog_613212e10100hin2.html&nbsp;&nbsp; ，还必须参考下这个哥们的这篇文章：<br/>http://hi.baidu.com/luoxiandong99/blog/item/0a0c86b5799efa1119d81ffd.html<br/>摘录：<br/>为什么会存在差异，这和on与where查询顺序有关。<br/><br/>我们知道标准查询关键字执行顺序为 from-&gt;where-&gt;group by-&gt;having-&gt;order by[ 记得不是很清楚呢]<br/>left join 是在from范围类所以 先on条件筛选表，然后两表再做left join。<br/>而对于where来说在left join结果再次筛选。<br/>。。。<br/><br/>如下：<br/>现有两个表，商品表(products)和sales_detail(销售记录 表)。如下:<br/><textarea name="code" class="html" rows="15" cols="100">
products:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pid pname pcode
&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp; 商品1&nbsp;&nbsp; AC90
&nbsp;&nbsp;&nbsp;&nbsp;2&nbsp;&nbsp; 商品2 DE78
&nbsp;&nbsp;&nbsp;&nbsp; 3&nbsp;&nbsp; 商品3&nbsp;&nbsp;&nbsp;&nbsp;XXXX
</textarea><br/><textarea name="code" class="html" rows="15" cols="100">
sales_detail:
&nbsp;&nbsp;&nbsp;&nbsp;aid pcode saletime
&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp; AC90 2008-09-22
&nbsp;&nbsp;&nbsp;&nbsp;2&nbsp;&nbsp; DE78 2008-09-22
&nbsp;&nbsp;&nbsp;&nbsp;3&nbsp;&nbsp; AC90 2008-09-23
&nbsp;&nbsp;&nbsp;&nbsp;4&nbsp;&nbsp; AC90 2008-09-24
</textarea><br/>按商品在某个时间段内的销售量来排行，比如我想统计23－24号这两天的销售数量并排行。（注：DE78这个商品在这两天没有销售，但是也要显示出来，只 是数量为0）。<br/>-- 表的结构 `products`：<br/><textarea name="code" class="html" rows="15" cols="100">
CREATE TABLE `products` (
&nbsp;&nbsp; `pid` int(3) NOT NULL auto_increment,
&nbsp;&nbsp; `pname` varchar(20) NOT NULL,
&nbsp;&nbsp; `pcode` varchar(20) NOT NULL,
&nbsp;&nbsp; PRIMARY KEY&nbsp;&nbsp; (`pid`)
) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
</textarea><br/>表中的数据 `products`：<br/><textarea name="code" class="html" rows="15" cols="100">
INSERT INTO `products` (`pid`, `pname`, `pcode`) VALUES (1, &#039;商品1&#039;, &#039;AC90&#039;),
(2, &#039;商品2&#039;, &#039;DE78&#039;),
(3, &#039;商品3&#039;, &#039;XXXX&#039;);
</textarea><br/>表的结构 `sales_detail`：<br/><textarea name="code" class="html" rows="15" cols="100">
CREATE TABLE `sales_detail` (
&nbsp;&nbsp; `aid` int(3) NOT NULL auto_increment,
&nbsp;&nbsp; `pcode` varchar(20) NOT NULL,
&nbsp;&nbsp; `saletime` date NOT NULL,
&nbsp;&nbsp; PRIMARY KEY&nbsp;&nbsp; (`aid`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1
</textarea><br/><br/>表中的数据 `sales_detail`:<br/><textarea name="code" class="html" rows="15" cols="100">
INSERT INTO `sales_detail` (`aid`, `pcode`, `saletime`) VALUES (1, &#039;AC90&#039;, &#039;2008-09-22&#039;),
(2, &#039;DE78&#039;, &#039;2008-09-22&#039;),
(3, &#039;AC90&#039;, &#039;2008-09-23&#039;),
(4, &#039;AC90&#039;, &#039;2008-09-24&#039;);
</textarea><br/>查询：<br/>区别两条sql语句：<br/><br/>select p.pname,p.pcode,s.saletime,count(s.aid) as total from products as p<br/>left join sales_detail as s on (s.pcode=p.pcode)<br/>where s.saletime in (&#039;2008-09-23&#039;,&#039;2008-09-24&#039;)<br/>group by p.pcode order by total desc,p.pid asc<br/><br/>+---------+-------+------------+-------+<br/>&#124; pname&nbsp;&nbsp; &#124; pcode &#124; saletime&nbsp;&nbsp; &#124; total &#124;<br/>+---------+-------+------------+-------+<br/>&#124; 商品1&nbsp;&nbsp; &#124; AC90 &#124; 2008-09-23 &#124;&nbsp;&nbsp;&nbsp;&nbsp; 2 &#124;<br/>+---------+-------+------------+-------+<br/><br/>select p.pname,p.pcode,s.saletime,count(s.aid) as total from products as p<br/>left join sales_detail as s on ((s.pcode=p.pcode) and s.saletime in (&#039;2008-09-23&#039;,&#039;2008-09-24&#039;))<br/>group by p.pcode order by total desc,p.pid asc<br/>+---------+-------+------------+---------+<br/>&#124; pname&nbsp;&nbsp; &#124; pcode &#124; saletime&nbsp;&nbsp; &#124; total &#124;<br/>+---------+-------+------------+-------+<br/>&#124; 商品1&nbsp;&nbsp; &#124; AC90 &#124; 2008-09-23 &#124;&nbsp;&nbsp;&nbsp;&nbsp; 2 &#124;<br/>&#124; 商品2&nbsp;&nbsp; &#124; DE78 &#124; NULL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#124;&nbsp;&nbsp;&nbsp;&nbsp; 0 &#124;<br/>&#124; 商品3&nbsp;&nbsp; &#124; XXXX&nbsp;&nbsp; &#124; NULL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#124;&nbsp;&nbsp;&nbsp;&nbsp; 0 &#124;<br/>+---------+-------+------------+---------+<br/>心得：on中的条件关联，一表数据不满足条件时会显示空值。where则输出两表完全满足条件数据。<br/>================================================================================================<br/>后记：逐步引入coalesce函数及adddate函数：<br/>（1）简单left查询：<br/>mysql&gt; select * from products as p left join sales_detail as s on p.pcode=s.pcode;<br/>+-----+---------+-------+------+-------+------------+<br/>&#124; pid &#124; pname&nbsp;&nbsp; &#124; pcode &#124; aid&nbsp;&nbsp;&#124; pcode &#124; saletime&nbsp;&nbsp; &#124;<br/>+-----+---------+-------+------+-------+------------+<br/>&#124;&nbsp;&nbsp; 1 &#124; 商品1 &#124; AC90&nbsp;&nbsp;&#124;&nbsp;&nbsp;&nbsp;&nbsp;1 &#124; AC90&nbsp;&nbsp;&#124; 2008-09-22 &#124; <br/>&#124;&nbsp;&nbsp; 1 &#124; 商品1 &#124; AC90&nbsp;&nbsp;&#124;&nbsp;&nbsp;&nbsp;&nbsp;3 &#124; AC90&nbsp;&nbsp;&#124; 2008-09-23 &#124; <br/>&#124;&nbsp;&nbsp; 1 &#124; 商品1 &#124; AC90&nbsp;&nbsp;&#124;&nbsp;&nbsp;&nbsp;&nbsp;4 &#124; AC90&nbsp;&nbsp;&#124; 2008-09-24 &#124; <br/>&#124;&nbsp;&nbsp; 2 &#124; 商品2 &#124; DE78&nbsp;&nbsp;&#124;&nbsp;&nbsp;&nbsp;&nbsp;2 &#124; DE78&nbsp;&nbsp;&#124; 2008-09-22 &#124; <br/>&#124;&nbsp;&nbsp; 3 &#124; 商品3 &#124; XXXX&nbsp;&nbsp;&#124; NULL &#124; NULL&nbsp;&nbsp;&#124; NULL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#124; <br/>+-----+---------+-------+------+-------+------------+<br/>5 rows in set (0.00 sec)<br/>（2）加入时间范围：<br/>mysql&gt; select * from products as p left join sales_detail as s on p.pcode=s.pcode where s.saletime in (&#039;2008-09-23&#039;,&#039;2008-09-24&#039;);<br/>+-----+---------+-------+------+-------+------------+<br/>&#124; pid &#124; pname&nbsp;&nbsp; &#124; pcode &#124; aid&nbsp;&nbsp;&#124; pcode &#124; saletime&nbsp;&nbsp; &#124;<br/>+-----+---------+-------+------+-------+------------+<br/>&#124;&nbsp;&nbsp; 1 &#124; 商品1 &#124; AC90&nbsp;&nbsp;&#124;&nbsp;&nbsp;&nbsp;&nbsp;3 &#124; AC90&nbsp;&nbsp;&#124; 2008-09-23 &#124; <br/>&#124;&nbsp;&nbsp; 1 &#124; 商品1 &#124; AC90&nbsp;&nbsp;&#124;&nbsp;&nbsp;&nbsp;&nbsp;4 &#124; AC90&nbsp;&nbsp;&#124; 2008-09-24 &#124; <br/>+-----+---------+-------+------+-------+------------+<br/>2 rows in set (0.00 sec)<br/><br/>（3）加入group by查询：<br/>mysql&gt; select * from products as p left join sales_detail as s on p.pcode=s.pcode where s.saletime in (&#039;2008-09-23&#039;,&#039;2008-09-24&#039;) group by p.pcode;<br/>+-----+---------+-------+------+-------+------------+<br/>&#124; pid &#124; pname&nbsp;&nbsp; &#124; pcode &#124; aid&nbsp;&nbsp;&#124; pcode &#124; saletime&nbsp;&nbsp; &#124;<br/>+-----+---------+-------+------+-------+------------+<br/>&#124;&nbsp;&nbsp; 1 &#124; 商品1 &#124; AC90&nbsp;&nbsp;&#124;&nbsp;&nbsp;&nbsp;&nbsp;3 &#124; AC90&nbsp;&nbsp;&#124; 2008-09-23 &#124; <br/>+-----+---------+-------+------+-------+------------+<br/>1 row in set (0.00 sec)<br/>（4）加入count统计：<br/>mysql&gt; select *,count(s.aid) as total from products as p left join sales_detail as s on p.pcode=s.pcode where s.saletime in (&#039;2008-09-23&#039;,&#039;2008-09-24&#039;) group by p.pcode; <br/>+-----+---------+-------+------+-------+------------+-------+<br/>&#124; pid &#124; pname&nbsp;&nbsp; &#124; pcode &#124; aid&nbsp;&nbsp;&#124; pcode &#124; saletime&nbsp;&nbsp; &#124; total &#124;<br/>+-----+---------+-------+------+-------+------------+-------+<br/>&#124;&nbsp;&nbsp; 1 &#124; 商品1 &#124; AC90&nbsp;&nbsp;&#124;&nbsp;&nbsp;&nbsp;&nbsp;3 &#124; AC90&nbsp;&nbsp;&#124; 2008-09-23 &#124;&nbsp;&nbsp;&nbsp;&nbsp; 2 &#124; <br/>+-----+---------+-------+------+-------+------------+-------+<br/>1 row in set (0.00 sec)<br/>（5）改变查询出现了Null值变为1，如下，（接着就是如何去掉Null）：<br/>mysql&gt; select p.pname,p.pcode,s.saletime,count(s.aid) as total from products as p<br/>&nbsp;&nbsp;&nbsp;&nbsp;-&gt; left join sales_detail as s on ((s.pcode=p.pcode) and s.saletime in (&#039;2008-09-23&#039;,&#039;2008-09-24&#039;))<br/>&nbsp;&nbsp;&nbsp;&nbsp;-&gt; group by p.pcode order by total desc,p.pid asc;<br/>+---------+-------+------------+-------+<br/>&#124; pname&nbsp;&nbsp; &#124; pcode &#124; saletime&nbsp;&nbsp; &#124; total &#124;<br/>+---------+-------+------------+-------+<br/>&#124; 商品1 &#124; AC90&nbsp;&nbsp;&#124; 2008-09-23 &#124;&nbsp;&nbsp;&nbsp;&nbsp; 2 &#124; <br/>&#124; 商品2 &#124; DE78&nbsp;&nbsp;&#124; NULL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#124;&nbsp;&nbsp;&nbsp;&nbsp; 0 &#124; <br/>&#124; 商品3 &#124; XXXX&nbsp;&nbsp;&#124; NULL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#124;&nbsp;&nbsp;&nbsp;&nbsp; 0 &#124; <br/>+---------+-------+------------+-------+<br/>3 rows in set (0.00 sec)<br/>（6）用函数coalesce来去掉Null的情况：<br/>mysql&gt; select p.pname,p.pcode,coalesce(s.saletime,&#039;0&#039;),count(s.aid) as total from products as p left join sales_detail as s on ((s.pcode=p.pcode) and s.saletime in (&#039;2008-09-23&#039;,&#039;2008-09-24&#039;)) group by p.pcode order by total desc,p.pid asc;<br/>+---------+-------+--------------------------+-------+<br/>&#124; pname&nbsp;&nbsp; &#124; pcode &#124; coalesce(s.saletime,&#039;0&#039;) &#124; total &#124;<br/>+---------+-------+--------------------------+-------+<br/>&#124; 商品1 &#124; AC90&nbsp;&nbsp;&#124; 2008-09-23&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#124;&nbsp;&nbsp;&nbsp;&nbsp; 2 &#124; <br/>&#124; 商品2 &#124; DE78&nbsp;&nbsp;&#124; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#124;&nbsp;&nbsp;&nbsp;&nbsp; 0 &#124; <br/>&#124; 商品3 &#124; XXXX&nbsp;&nbsp;&#124; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#124;&nbsp;&nbsp;&nbsp;&nbsp; 0 &#124; <br/>+---------+-------+--------------------------+-------+<br/>（7）加入Mysql的时间函数带入查询，adddate函数日期带入where中的in查询情况：<br/>mysql&gt; select p.pname,p.pcode,coalesce(s.saletime,&#039;0&#039;),count(s.aid) as total from products as p left join sales_detail as s on ((s.pcode=p.pcode) and s.saletime in (&#039;2008-09-23&#039;,adddate(timestamp(&quot;2008-09-23&quot;), interval 1 day))) group by p.pcode order by total desc,p.pid asc;&nbsp;&nbsp;&nbsp;&nbsp; <br/>+---------+-------+--------------------------+-------+<br/>&#124; pname&nbsp;&nbsp; &#124; pcode &#124; coalesce(s.saletime,&#039;0&#039;) &#124; total &#124;<br/>+---------+-------+--------------------------+-------+<br/>&#124; 商品1 &#124; AC90&nbsp;&nbsp;&#124; 2008-09-23&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#124;&nbsp;&nbsp;&nbsp;&nbsp; 2 &#124; <br/>&#124; 商品2 &#124; DE78&nbsp;&nbsp;&#124; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#124;&nbsp;&nbsp;&nbsp;&nbsp; 0 &#124; <br/>&#124; 商品3 &#124; XXXX&nbsp;&nbsp;&#124; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#124;&nbsp;&nbsp;&nbsp;&nbsp; 0 &#124; <br/>+---------+-------+--------------------------+-------+<br/>3 rows in set (0.00 sec)<br/><br/>
]]>
</description>
</item><item>
<link>http://www.jackxiang.com/post/4936/#blogcomment63437</link>
<title><![CDATA[[评论] [实践Ok]mysql关联left join条件on和where条件的区别及结合coalesce函数及adddate函数的用法]]></title> 
<author>hxngb5lf &lt;kcja74@mail114.net&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Wed, 15 Feb 2012 17:30:14 +0000</pubDate> 
<guid>http://www.jackxiang.com/post/4936/#blogcomment63437</guid> 
<description>
<![CDATA[ 
	要看要看。謝謝分享哦
]]>
</description>
</item>
</channel>
</rss>