group后将给出哪条记录这对各种数据库是不一样的,比如mysql给出的是第一次出现的那条
不过这并没有什么关系。因为group(分组)是为了进行数理统计,而不是取得某条记录

解决方案 »

  1.   

    那我想取得记录。但是只选择chapter(章节)表中所有最新的章节。为了bookid不重复,所以采用这个筛选的方法。这样的话应该怎么实现?有没有其他mysql方法?
      

  2.   

    不明白了,bookid怎么会重复呢?他不是与“章节”一一对应的吗?难道两个章节会有一个相同的bookid吗?那么你根据什么来区别章节甲和章节乙呢?
      

  3.   

    8.3.4 拥有某个字段的组间最大值的行
    “对每篇文章,找出有最贵的价格的交易者。” 在ANSI SQL中,我可以用这样一个子查询做到: SELECT article, dealer, price
    FROM   shop s1
    WHERE  price=(SELECT MAX(s2.price)
                  FROM shop s2
                  WHERE s1.article = s2.article)在MySQL中,最好是分几步做到: 得到一个表(文章,maxprice)。见8.3.4 拥有某个域的组间最大值的行。 
    对每篇文章,得到对应于存储最大价格的行。 
    这可以很容易用一个临时表做到: CREATE TEMPORARY TABLE tmp (
            article INT(4) UNSIGNED ZEROFILL DEFAULT '0000' NOT NULL,
            price   DOUBLE(16,2)             DEFAULT '0.00' NOT NULL);LOCK TABLES article read;INSERT INTO tmp SELECT article, MAX(price) FROM shop GROUP BY article;SELECT article, dealer, price FROM shop, tmp
    WHERE shop.article=tmp.articel AND shop.price=tmp.price;UNLOCK TABLES;DROP TABLE tmp;如果你不使用一个TEMPORARY表,你也必须锁定“tmp”表。 “它能一个单个查询做到吗?” 是的,但是只有使用我称之为“MAX-CONCAT诡计”的一个相当低效的诡计: SELECT article,
           SUBSTRING( MAX( CONCAT(LPAD(price,6,'0'),dealer) ), 7) AS dealer,
      0.00+LEFT(      MAX( CONCAT(LPAD(price,6,'0'),dealer) ), 6) AS price
    FROM   shop
    GROUP BY article;+---------+--------+-------+
    | article | dealer | price |
    +---------+--------+-------+
    |    0001 | B      |  3.99 |
    |    0002 | A      | 10.99 |
    |    0003 | C      |  1.69 |
    |    0004 | D      | 19.95 |
    +---------+--------+-------+最后例子当然能通过在客户程序中分割连结的列使它更有效一点。 
      

  4.   

    bookid会重复的啊。有两个表:book表和chapter表。在chapter表里面,bookid可以重复(因为不同章节可能是同一本书的)。
      

  5.   

    相当低效就不能考虑了。因为程序使用量很大,所以只能考虑简洁高效查询。刚开始的那个子查询,效率也不好啊。执行起来sql速度可能不理想。
      

  6.   

    这样显示出各组最大的b:
    select a,max(b) from table group by a
    如果需要整条记录不能直接用select *,max(b) 
    可以用子查询:
    select * from table where (a,b) in (select a,max(b) from table group by a)
    但是这样写的效率并不比上面稻草人那样的子查询好。
    稻草人那样的子查询应该是不差的,是很典型的子查询的应用。因为你本来的需求相对复杂,不能指望太简洁的方式。
    唯一麻烦的是可能上面两种方式都需要mysql版本支持,4.1是没问题的,低版本的不知道了。