$this->select('a.id,a.bookid,a.chapts,b.names,c.catename')
  ->from('t_chapter a left join t_book b on a.bookid = b.id left join t_cate c on b.types = c.id')
  ->where(' b.type=' . $type . ' and a.ifpass=1')
  ->groupby('a.bookid')
  ->orderby('a.id desc')
  ->limit('0,' . $num)
  ->findAll();
意思就是从章节列表左连接图书列表找出最新更新的章节以及对应的图书信息 第二个左连接可以忽略
现在这个能找到不重复的图书 但是章节不是最新的 章节id是最小的
groupby 之后bookid是不重复了 但是a.id desc 没起作用 感觉像是先执行group的时候是从a.id asc开始然后看到重复的bookid之后就把后面的跳过去了
但是groupby 和 orderby又不能交换位置
求大神帮忙看看

解决方案 »

  1.   

    描述太复杂了 去MYSQL问问好了
      

  2.   

    你先看看不orderby的时候是否是你想要的结果
      

  3.   

    如果你的 a.id 对应章节, a.bookid 对应图书
    那么 groupby('a.bookid') 显然是不对的
    先不说分组时结果是取第一次遇到的还是最后一次遇到的(反正只有一个值)
    既然是 最新更新的章节以及对应的图书信息
    那么为什么一本图书不能有两个以上的章节被更新呢?bookid 重复是正常的,他表示同一图书有多个章节被修改
      

  4.   

    你的描述比较复杂,标题似乎也没有指出问题要点。如果我没理解错的话,你问到了一个 sql 查询逻辑中的一个经典问题:如何找出在 group 中按特定排序的某些记录。推荐阅读一个网页:How to select the first/least/max row per group in SQL
    http://www.xaprb.com/blog/2006/12/07/how-to-select-the-firstleastmax-row-per-group-in-sql/你给出的那个查询,实际上是在每个 group 中随机选出一条记录(准确地说是扫描过程中在这个 group 中遇到的第一条记录,既不是你说的那个好像的 a.id asc,也不是任何特定的排序),然后在最终的结果集里再按 a.id desc 排序,所以当然不是你想要的。
    ————————————————————————————————
    基于CSDN论坛提供的插件扩展功能,自己做了个签名档工具,分享给大家,欢迎技术交流 :)