现在有一个表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,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
(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
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>
(select distinct a from s_title) t1
显然会产生较少的临时记录。
商品表:商品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 我纯菜鸟。 哪个索引效率高什么的不会。高手们觉得要建哪个索引好,就建哪个,呵呵。
建议你列出你的表结构,并提供测试数据以及基于这些测试数据的所对应正确结果。
参考一下这个贴子的提问方式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)
这样想帮你的人可以直接搭建和你相同的环境,并在给出方案前进行测试,避免文字描述理解上的误差。
为什么不在count(*)=1的范围内去排序呢?
要优化就把(a,b)index
将记录与指定字段中的相等值组合成单一记录。如果使 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 合计函数中作为参数。