一个产品表,有多个商家。每个商家有N个产品。
要求让每个商家只能显示一个最新产品,直接group by 商家id后,结果集默认是商家的一条最早的产品。SELECT * FROM tbl WHERE status=1 GROUP BY bizid ORDER BY level DESC;
搜索了下,找到了以下二个方法,但觉得效率都不高(原应用的sql条件太多),想请教下除此外不知还有没有更好的办法?1、SELECT * FROM(SELECT * FROM tbl ORDER BY id DESC) tem_tpl GROUP BY bizid;2、SELECT * FROM tbl WHERE id IN(SELECT MAX(id) FROM tbl GROUP BY bizid);

解决方案 »

  1.   

    贴表结构  用exists可以高效实现
      

  2.   

    参考下贴中的多种方法http://topic.csdn.net/u/20091231/16/2f268740-391e-40f2-a15e-f243b2c925ab.html
    [征集]分组取最大N条记录方法征集,及散分....
      

  3.   


    exists只是判断条件,只要倒序恐怕不行吧?
      

  4.   

    贴建表及插入记录的SQL,及要求结果出来看看
      

  5.   

    具体的可以explain select * from tb查询一下执行的计划。
      

  6.   

    那我就贴下测试记录让各位高人试下。CREATE TABLE products (
       id int(10) primary key,
       biz_id int(10),
       pronduct_ame varchar(50),
       status tinyint(1),
       levels int(10)
    ) ENGINE=MyISAM;INSERT INTO products VALUES  
    (1,'1','书籍1',1,10),
    (2,'1','书籍2',1,10),
    (3,'1','书籍3',1,10),
    (4,'2','教材1',1,22),
    (5,'2','教材2',1,22),
    (6,'3','工具1',1,15),
    (7,'3','工具2',1,15);期望结果+----+------+------+------+
    | id | biz_id | pronduct_name | status | levels
    +----+------+------+------+
    | 5 | 2 | 教材2 | 1 | 22
    | 7 | 3 | 工具2 | 1 | 15
    | 3 | 1 | 书籍3 | 1 | 10
    +----+------+------+------+
    现用的语句
    SELECT * FROM products WHERE id IN(SELECT MAX(id) FROM products GROUP BY biz_id) ORDER BY levels DESC; 解释:biz_id为商家id,一个商家有几个产品,但只能显示一个最新的。比如像商家1里有1、2、3 共三个产品,就只要显示id为3的产品。
      

  7.   

    SELECT * FROM products a WHERE NOT EXISTS(SELECT 1 FROM products WHERE a.`biz_id`=`biz_id` AND a.`id`<id)
      在biz_id、ID上建立复合索引
      

  8.   

    少量数据很难测试效率,仅能验证SQL语句是否能得到正确结果。建议楼主根据贴子中的多种方法测试一下,如果效率很差,则应该是索引没有正确创建。 你可以贴出你的explain SELECT * FROM(SELECT * FROM tbl ORDER BY id DESC) tem_tpl GROUP BY bizid;
    explain SELECT * FROM tbl WHERE id IN(SELECT MAX(id) FROM tbl GROUP BY bizid);
    explain ...的结果以供大家分析。
      

  9.   

    请问
    SELECT * FROM products a WHERE NOT EXISTS(SELECT 1 FROM products WHERE a.`biz_id`=`biz_id` AND a.`id`<id)
    执行逻辑是什么,看不大懂……
      

  10.   

    谢谢各位,因目前的数据量并不多,比较不出效率。10楼的语法用EXISTS去比较看着较难理解,但效率应该比IN好些吧。