现在有一个表1  它有2列:分别是 A B 
现在表中有如下数据
1,2,
1,2,
2,1,
2,2,
1,1,
2,1,
3,2,
3,2,
请查出如下结果:
1, 1
2, 2
3, null
结果是这样算来的: 首先 A 列中有1,2,3三个不同的值
记录分别为:
1组:
1,2,
1,2,
1,1
2组:
2,1
2,2
2,1
3组:
3.2
3.2
然后看B列的值
1组中 最小的为1 所有结果为 1,1
2组中 最小的也为1 但是这里的1不是唯一的(既有2条 2,1) 所以选结果为 2,2(依次类推) 选唯一最低的(先去掉重复的,然后选最低的)
3组中 最小的为2 但是这里有2个2 而且不存在别的记录。所有3结果为 3,null 

解决方案 »

  1.   

    SELECT a1.a,min(b1.s) from tt5 a1  left join 
    (SELECT a,b,min(b) as s from tt5 group by a,b having count(*)=1) b1
    on a1.a=b1.a
    group by a1.a
      

  2.   

    sqlite> select * from s_title;
    a|b
    1|2
    1|2
    2|1
    2|2
    1|1
    2|1
    3|2
    3|2
    sqlite> select t1.a,t2.b
       ...> from (select distinct a from s_title) t1 left join (
       ...>                 select a,b
       ...>                 from s_title
       ...>                 group by a,b
       ...>                 having count(*)=1
       ...>         ) t2 on t1.a=t2.a;
    a|b
    1|1
    2|2
    3|
    sqlite>
      

  3.   

    如果是MYSQL的话,用EXPLAIN看看,你的索引情况?
      

  4.   

    从笛卡尔积的结果看
    (select distinct a from s_title) t1
    显然会产生较少的临时记录。
      

  5.   

    其实我的实际问题是这样的。 有4个表
    商品表:商品ID 商品名
    用户表:用户ID  用户名
    活动表:活动ID 活动名 商品ID
    出价表:出价ID  活动ID  用户ID  出价 
    请查出每个活动目前为止  出价唯一最低(不重复的出价中最低的那个)的用户的信息,以及商品信息。商品表:
    记录1:(ID)1   (商品名) 大白菜
    记录2:(ID)2   (商品名) 小白菜
    用户表:记录1:(ID)1  (用户名)小白
    记录2:(ID)2  (用户名)小白1
    活动表:
    记录1: (ID)1 (活动名)白给(商品iD)1
    记录2: (ID)2   (活动名)钱吧 (商品iD)2出价表:
    记录1:(id)1 (活动id)1 (用户id)2 (出价)1.2
    记录2:(id)2 (活动id)2 (用户id)2 (出价)1.3
    记录1:(id)3 (活动id)1 (用户id)1 (出价)1.4
    记录2:(id)4 (活动id)1 (用户id)1 (出价)1.2
    记录1:(id)5 (活动id)2 (用户id)2 (出价)1.2
    记录1:(id)6 (活动id)2 (用户id)1 (出价)1.3查处结果如下
    活动ID   活动名  商品ID 商品名 用户iD  用户名 出价 
    1          白给       1         大白菜  1         小白     1.4
    2         钱吧        2         小白菜    2       小白1     1.2希望高手们能帮帮我。给个效率高点的sql 我纯菜鸟。 哪个索引效率高什么的不会。高手们觉得要建哪个索引好,就建哪个,呵呵。
      

  6.   

    建议楼主,把你的 create table / insert into 语句都给出来, (不要高估你的汉语表达能力或者我的汉语理解能力)
       建议你列出你的表结构,并提供测试数据以及基于这些测试数据的所对应正确结果。
       参考一下这个贴子的提问方式http://topic.csdn.net/u/20091130/20/8343ee6a-417c-4c2d-9415-fa46604a00cf.html
       
       1. 你的 create table xxx .. 语句
       2. 你的 insert into xxx ... 语句
       3. 结果是什么样,(并给以简单的算法描述)
       4. 你用的数据库名称和版本(经常有人在MS SQL server版问 MySQL)
       
       这样想帮你的人可以直接搭建和你相同的环境,并在给出方案前进行测试,避免文字描述理解上的误差。   
      

  7.   

    distinct只是积的范围小了 还是同样要搜索表
    为什么不在count(*)=1的范围内去排序呢?
    要优化就把(a,b)index
      

  8.   

    非常感谢各位的回答,依ACMAIN_CHM 所说把数据结构拿出来。还是不了。因为我实际情况数据表属性较多。又没做注释,想插入一条记录都很麻烦。 所以不麻烦大家了。 现在我依据各位的回答,基本解决了问题。 我sql真的很菜。 还望哪位老师能给我相信说明下 group by 的用法。 特别是当group by 后面有多个字段的时候情况。 再次谢谢各位。
      

  9.   

    GROUP BY 子句
    将记录与指定字段中的相等值组合成单一记录。如果使 SQL 合计函数,例如 Sum或Count,蕴含于 SELECT 语句中,会创建一个各记录的总计值。语法
    SELECT 字段表
        FROM 表
        WHERE标准
        [GROUP BY 分组字段表]包含 GROUP BY 子句的 SELECT 语句具有以下几个部分:部分 说明 
    fieldlist 要和任何字段名别名, SQL 合计函数, 选择断定 (ALL, DISTINCT, DISTINCTROW, 或 TOP),或其他 SELECT 语句 选择一起检索的字段名称。 
    table 从其中获取记录的表的名称。欲知更多信息请看 FROM 子句. 
    criteria 选择准则。如果此语句包含一个 WHERE 子句, Microsoft Jet 数据库引擎 会在记录上应用WHERE条件,然后把值分组。 
    groupfieldlist 用来对记录分组的字段名,最多有 10 个字段。在 groupfieldlist 中字段名的顺序将决定组层次,由最高至最低的层次来分组。 
    说明
    GROUP BY 是可选的。如果在 SELECT 语句中没有 SQL 合计函数,则可省略总计值。Null值在 GROUP BY字段中,则会被分组而不被省略。但是在任何 SQL 合计函数中不计算 Null 值。使用 WHERE 子句可以排除您不想分组的行,而将记录分组后,用 HAVING 子句过滤这些记录。除非包含备注数据或 OLE 对象数据,否则, GROUP BY 字段列表中的字段可引用 FROM 子句中的任何表的任何字段,即使 SELECT 语句不包含此字段,只要它至少包含一个 SQL 合计函数即可。Microsoft® Jet 数据库引擎无法在“备注对象”或“OLE 对象”字段上进行分组。SELECT 字段列表中的全部字段必须包含在 GROUP BY 子句中,或在 SQL 合计函数中作为参数。