<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></title> 
<link>http://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://jackxiang.com/post//</link>
<title><![CDATA[mysql对于union查询和一个超长的sql，分析备份！]]></title> 
<author>jack &lt;xdy108@126.com&gt;</author>
<category><![CDATA[WEB2.0]]></category>
<pubDate>Wed, 03 Sep 2008 10:44:15 +0000</pubDate> 
<guid>http://jackxiang.com/post//</guid> 
<description>
<![CDATA[ 
	除非指定了 TOP，否则 ORDER BY 在子查询中无效<br/>select * from (select * from tbl order by id1) order by id2 desc<br/>以上报错误“除非同时指定了 TOP，否则 ORDER BY 子句在视图、内嵌函数、派生表和子查询中无效。”。应该在第二个 select 中指定 top。<br/>select * from (select top 100 * from tbl order by id1) order by id2 desc<br/><br/>http://www.5do8.com/blog/doc/479/index.aspx<br/>所有人排行：<br/>select distinct t.uid , t.max_score from (select max(score) as max_score,uid from&nbsp;&nbsp;user_answer where s_id=2&nbsp;&nbsp;group by uid ) t left join&nbsp;&nbsp;user_answer as b on t.max_score=b.score and t.uid=b.uid where b.s_id=2 order by t.max_score desc, b.ctime, b.uid limit 0,10<br/>功能一样(还是不太一样有区别)：<br/>select uid, score from user_answer&nbsp;&nbsp;where score in(select max(score) as max_score from&nbsp;&nbsp;user_answer where s_id=2&nbsp;&nbsp;group by uid) and s_id=2 group by uid order by score desc,ctime,uid limit 0,10<br/><br/>select count(distinct uid) as p_count from user_answer where s_id=2<br/><br/>全部好友排行：<br/>select distinct t.uid , t.max_score from (select max(score) as max_score,uid from user_answer where uid in (1316410557,1371580830,1052833673,1373548532) and s_id=2 group by uid ) t left join user_answer as b on t.max_score=b.score and t.uid=b.uid where b.s_id=2 order by t.max_score desc, b.ctime,b.uid limit 0,10<br/><br/>select count(distinct uid) as p_count from user_answer where uid in (1316410557,1371580830,1052833673,1373548532) and s_id=2<br/><br/><br/>在使用mysql时，有时需要查询出某个字段不重复的记录，虽然mysql提供有distinct这个关键字来过滤掉多余的重复记录只保留一条，但往往只用它来返回不重复记录的条数，而不是用它来返回不重记录的所有值。其原因是distinct只能返回它的目标字段，而无法返回其它字段，这个问题让我困扰了很久，用distinct不能解决的话，我只有用二重循环查询来解决，而这样对于一个数据量非常大的站来说，无疑是会直接影响到效率的。所以我花了很多时间来研究这个问题，网上也查不到解决方案，期间把朋友拉来帮忙，结果是我们两人都郁闷了！ <br/><br/><br/>下面先来看看例子： <br/><br/><br/>table <br/><br/>id name <br/><br/>1 a <br/><br/>2 b <br/><br/>3 c <br/><br/>4 c <br/><br/>5 b <br/><br/><br/>库结构大概这样，这只是一个简单的例子，实际情况会复杂得多。 <br/><br/><br/>比如我想用一条语句查询得到name不重复的所有数据，那就必须使用distinct去掉多余的重复记录。 <br/><br/><br/>select distinct name from table <br/><br/>得到的结果是: <br/><br/><br/>name <br/><br/>a <br/><br/>b <br/><br/>c <br/><br/><br/>好像达到效果了，可是，我想要得到的是id值呢？改一下查询语句吧: <br/><br/><br/>select distinct name, id from table <br/><br/><br/>结果会是: <br/><br/><br/>id name <br/><br/>1 a <br/><br/>2 b <br/><br/>3 c <br/><br/>4 c <br/><br/>5 b <br/><br/><br/>distinct怎么没起作用？作用是起了的，不过他同时作用了两个字段，也就是必须得id与name都相同的才会被排除…… <br/><br/><br/>我们再改改查询语句: <br/><br/><br/>select id, distinct name from table <br/><br/><br/>很遗憾，除了错误信息你什么也得不到，distinct必须放在开头。难到不能把distinct放到where条件里？能，照样报错。。。。。。。 <br/><br/><br/>很麻烦吧？确实，费尽心思都没能解决这个问题。没办法，继续找人问。 <br/><br/><br/>拉住公司里一JAVA程序员，他给我演示了oracle里使用distinct之后，也没找到mysql里的解决方案，最后下班之前他建议我试试group by。 <br/><br/><br/>试了半天，也不行，最后在mysql手册里找到一个用法，用group_concat(distinct name)配合group by name实现了我所需要的功能，兴奋，天佑我也，赶快试试。 <br/><br/><br/>报错。。。。。。。。。。。。郁闷。。。。。。。连mysql手册也跟我过不去，先给了我希望，然后又把我推向失望，好狠哪。。。。 <br/><br/><br/>再仔细一查，group_concat函数是4.1支持，晕，我4.0的。没办法，升级，升完级一试，成功。。。。。。 <br/><br/><br/>终于搞定了，不过这样一来，又必须要求客户也升级了。 <br/><br/><br/>突然灵机一闪，既然可以使用group_concat函数，那其它函数能行吗？ <br/><br/><br/>赶紧用count函数一试，成功，我。。。。。。。想哭啊，费了这么多工夫。。。。。。。。原来就这么简单…… <br/><br/><br/>现在将完整语句放出: <br/><br/><br/>select *, count(distinct name) from table group by name <br/><br/><br/>结果: <br/><br/><br/>id name count(distinct name) <br/><br/>1 a 1 <br/><br/>2 b 1 <br/><br/>3 c 1 <br/><br/><br/>最后一项是多余的，不用管就行了，目的达到。 <br/><br/><br/>唉，原来mysql这么笨，轻轻一下就把他骗过去了，郁闷也就我吧（对了，还有容容那家伙），现在拿出来希望大家不要被这问题折腾。 <br/><br/><br/>哦，对，再顺便说一句，group by 必须放在 order by 和 limit之前，不然会报错. <br/><br/>更郁闷的事情发生了，在准备提交时容容发现，有更简单的解决方法: <br/><br/><br/>select id, name from table group by name <br/><br/><br/>看来对mysql的了解还是太肤浅了，不怕被笑话，发出来让大家别犯同样的错误。<br/><br/><br/>
]]>
</description>
</item><item>
<link>http://jackxiang.com/post//#blogcomment</link>
<title><![CDATA[[评论] mysql对于union查询和一个超长的sql，分析备份！]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>http://jackxiang.com/post//#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>