如题,如果mysql数据库中有一个表table,字段分别有a、b、c、d,想根据字段a分组,然后显示每组的第一条,sql语句格式为:select a,MIN(b),c,d from table group by a。
在sql查询的结果集中,b字段可以取到最小值,那么c和d字段是取?数据内容
a   b   c   d
1   1   1   1
1   2   2   2
1   3   3   3以上数据内容从mysql数据库直接查询,结果集为:1、1、1、1,但是从代码里查询,返回的结果集是:1,1,3,3。求大神解惑!!!

解决方案 »

  1.   

    select a,MIN(b),MIN(c),MIN(d) from table group by a
      

  2.   

    按照group by上一个过程的得到的结果集中的第一行。这个第一行是按照物理存储顺序的第一行,是随机不可预测的。
    当数据group by后,上下文会切换为每个组而不再是每行。因此,标准SQL中,select字段列表中无法使用非分组字段,因为违反了关系模型的范式。
    在mysql中,对标准SQL的GROUP BY进行了扩展(换句话说,违反了关系模型的范式),select字段列表中可以使用非分组字段。
    http://www.cnblogs.com/f-ck-need-u/p/8656828.html
      

  3.   


    谢谢回答,按文中的意思,虽然mysql对group by进行了扩展,但是不按sql规范写的sql语句执行的结果是不可预知,随机的,所以最好还是按照sql规范写语句,是这样吧?
      

  4.   

    如果你想按照标准SQL来理解,自然更好(这也表示同时理解了SQL SERVER,ORACLE的SQL语法,因为它们在SQL规范化上严格遵守SQL标准)。
    但SQL规范既然是为了标准而定的,自然是可以违反的,毕竟MySQL也有它自己的"个性"。只要你知道这么做对你的需求不造成影响(特别是增删改语句),那就无所谓啊。
      

  5.   

    SELECT a,b,c,d FROM TABLE WHERE (a,CONCAT(b,c,d)) IN (SELECT a,MIN(CONCAT(b,c,d)) bcd FROM TABLE GROUP BY a)