我在书上和网上都看到了以下的内容:
GROUP BY 是分组查询, 一般 GROUP BY 是和聚合函数配合使用
group by 有一个原则,就是 select 后面的所有列中,没有使用聚合函数的列,必须出现在 group by 后面但是我如下的例子却正确执行成功了customer表的数据
ID NAME AGE
1 Tom 21
2 Mike 24
3 Jack 30
4 Linda 25
5 Tom 25订单orders表的数据
ID ORDER_NUMBER PRICE CUSTOMER_ID
1 Tom_Order001 100 1
2 Tom_Order002 200 1
3 Tom_Order003 300 1
4 Mike_Order001 100 2
5 Jack_Order001 200 3
6 Linda_Order001 100 4
7 UnknownOrder 200 null业务:
按客户分组,统计每个客户的订单数目sql是:
SELECT   c.id AS id,
         c.name AS name,
         c.age AS age,
         COUNT(o.id) AS num
FROM     customers c
         left JOIN orders o
           ON c.id = o.customer_id
GROUP BY c.id
执行成功了,
查询结果是:
id name age num
1 Tom 21 3
2 Mike 24 1
3 Jack 30 1
4 Linda 25 1
5 Tom 25 0这个跟“select 后面的所有列中,没有使用聚合函数的列,必须出现在 group by 后面”有违背,
不知道怎么回事,请高手指教

解决方案 »

  1.   

    mySQL 的语言支持这种非标SQL语句。但决不提倡这么用。
    12.2.7. SELECT Syntax
    MySQL extends the use of GROUP BY to allow selecting fields that are not mentioned in the GROUP BY clause.http://dev.mysql.com/doc/refman/5.1/zh/sql-syntax.html#select
    MySQL对GROUP BY的使用进行了扩展,允许选择在GROUP BY子句中没有被提到的字段。如果您没有得到预期的结果,请阅读GROUP BY的说明,请参见12.10节,“与GROUP BY子句同时使用的函数和修改程序”。
      

  2.   

    非常感谢楼上的朋友
    我真是恍然大悟呀,呵呵。我机器上就装了mysql,比较小因为麻烦朋友帮忙写一个想一个想实现我这个业务的sql
    谢谢了,
      

  3.   

    SELECT  c.id AS id, 
            c.name AS name, 
            c.age AS age, 
            COUNT(o.id) AS num 
    FROM    customers c 
            left JOIN orders o 
              ON c.id = o.customer_id 
    GROUP BY c.id 
    我是做java的
    我的这个sql其实是 在运行hibernate的时候生成的。既然有:“group by 有一个原则,就是 select 后面的所有列中,没有使用聚合函数的列,必须出现在 group by 后面 ”
    这么一个原则那么好像在写hibernate的hql语句的时候没有这个限制
    像:“select c.id,c.name,count(o) from Customer c left outer join c.orders o group by c.id”不知道ACMAIN_CHM朋友对hibernate有没有研究,这个问题以前都没又考虑过