首先来造一部分数据,表mygoods为商品表,cat_id为分类id,goods_id为商品id,status为商品当前的状态位(1:有效,0:无效)。

CREATE TABLE `mygoods` (

`goods_id` int(11) unsigned NOT NULL AUTO_INCREMENT,

`cat_id` int(11) NOT NULL DEFAULT '',

`price` tinyint(3) NOT NULL DEFAULT '',

`status` tinyint(3) DEFAULT '',

PRIMARY KEY (`goods_id`),

KEY `icatid` (`cat_id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `mygoods` VALUES (1, 101, 90, 0);

INSERT INTO `mygoods` VALUES (2, 101, 99, 1);

INSERT INTO `mygoods` VALUES (3, 102, 98, 0);

INSERT INTO `mygoods` VALUES (4, 103, 96, 0);

INSERT INTO `mygoods` VALUES (5, 102, 95, 0);

INSERT INTO `mygoods` VALUES (6, 102, 94, 1);

INSERT INTO `mygoods` VALUES (7, 102, 93, 1);

INSERT INTO `mygoods` VALUES (8, 103, 99, 1);

INSERT INTO `mygoods` VALUES (9, 103, 98, 1);

INSERT INTO `mygoods` VALUES (10, 103, 97, 1);

INSERT INTO `mygoods` VALUES (11, 104, 96, 1);

INSERT INTO `mygoods` VALUES (12, 104, 95, 1);

INSERT INTO `mygoods` VALUES (13, 104, 94, 1);

INSERT INTO `mygoods` VALUES (15, 101, 92, 1);

INSERT INTO `mygoods` VALUES (16, 101, 93, 1);

INSERT INTO `mygoods` VALUES (17, 101, 94, 0);

INSERT INTO `mygoods` VALUES (18, 102, 99, 1);

INSERT INTO `mygoods` VALUES (19, 105, 85, 1);

INSERT INTO `mygoods` VALUES (20, 105, 89, 0);

INSERT INTO `mygoods` VALUES (21, 105, 99, 1);

需求:每个分类下,找出两个价格最高的有效的商品。

1. 每个分类找出价格最高的两个商品

mysql> select a.*

-> from mygoods a

-> where (select count(*)

-> from mygoods

-> where cat_id = a.cat_id and price > a.price ) <2

-> order by a.cat_id,a.price desc;

+----------+--------+-------+--------+

| goods_id | cat_id | price | status |

+----------+--------+-------+--------+

| 2 | 101 | 99 | 1 |

| 17 | 101 | 94 | 0 |

| 18 | 102 | 99 | 1 |

| 3 | 102 | 98 | 0 |

| 8 | 103 | 99 | 1 |

| 9 | 103 | 98 | 1 |

| 11 | 104 | 96 | 1 |

| 12 | 104 | 95 | 1 |

| 21 | 105 | 99 | 1 |

| 20 | 105 | 89 | 0 |

+----------+--------+-------+--------+

10 rows in set (0.00 sec)

2. 每个分类找出价格最高的有效的两个商品(正确)

mysql> select a.*

-> from mygoods a

-> where (select count(*) from mygoods

-> where cat_id = a.cat_id and price > a.price and status=1 ) <2

-> and status=1

-> order by a.cat_id,a.price desc ;

+----------+--------+-------+--------+

| goods_id | cat_id | price | status |

+----------+--------+-------+--------+

| 2 | 101 | 99 | 1 |

| 16 | 101 | 93 | 1 |

| 18 | 102 | 99 | 1 |

| 6 | 102 | 94 | 1 |

| 8 | 103 | 99 | 1 |

| 9 | 103 | 98 | 1 |

| 11 | 104 | 96 | 1 |

| 12 | 104 | 95 | 1 |

| 21 | 105 | 99 | 1 |

| 19 | 105 | 85 | 1 |

+----------+--------+-------+--------+

10 rows in set (0.00 sec)

3. 每个分类找出价格最高的有效的两个商品(正确)

mysql> select a.*

-> from mygoods a

-> left join mygoods b

-> on a.cat_id = b.cat_id and a.price < b.price and b.status=1

-> where a.status=1

-> group by a.goods_id,a.cat_id,a.price

-> having count(b.goods_id) < 2

-> order by a.cat_id,a.price desc;

+----------+--------+-------+--------+

| goods_id | cat_id | price | status |

+----------+--------+-------+--------+

| 2 | 101 | 99 | 1 |

| 16 | 101 | 93 | 1 |

| 18 | 102 | 99 | 1 |

| 6 | 102 | 94 | 1 |

| 8 | 103 | 99 | 1 |

| 9 | 103 | 98 | 1 |

| 11 | 104 | 96 | 1 |

| 12 | 104 | 95 | 1 |

| 21 | 105 | 99 | 1 |

| 19 | 105 | 85 | 1 |

+----------+--------+-------+--------+

10 rows in set (0.00 sec)

4.每个分类找出价格最高的有效的两个商品(错误)

mysql> select a.*

-> from mygoods a

-> where (select count(*) from mygoods

-> where cat_id = a.cat_id and price > a.price ) <2 and status=1

-> order by a.cat_id,a.price desc;

+----------+--------+-------+--------+

| goods_id | cat_id | price | status |

+----------+--------+-------+--------+

| 2 | 101 | 99 | 1 |

| 18 | 102 | 99 | 1 |

| 8 | 103 | 99 | 1 |

| 9 | 103 | 98 | 1 |

| 11 | 104 | 96 | 1 |

| 12 | 104 | 95 | 1 |

| 21 | 105 | 99 | 1 |

+----------+--------+-------+--------+

7 rows in set (0.00 sec)

由上可知,如果需要增加条件的话,需要在两处增加条件。

可以将每个分组下的goods_id合并。

mysql> select cat_id,GROUP_CONCAT(goods_id) from mygoods group by cat_id;

+--------+------------------------+

| cat_id | GROUP_CONCAT(goods_id) |

+--------+------------------------+

| 101 | 1,2,15,16,17 |

| 102 | 3,5,6,7,18 |

| 103 | 4,8,9,10 |

| 104 | 11,12,13 |

| 105 | 19,20,21 |

+--------+------------------------+

5 rows in set (0.00 sec)

mysql分组取每组前几条记录&lpar;排名&rpar;

1.创建表 create table tb( name varchar(10), val int, memo varchar(20) ); 2.插入数据 insert into tb values(' ...

mysql单列去重复group by分组取每组前几条记录加order by排序

mysql分组取每组前几条记录(排名) 附group by与order by的研究,需要的朋友可以参考下 --按某一字段分组取最大(小)值所在行的数据 复制代码代码如下: /* 数据如下: name ...

Mysql SQL分组取每组前几条记录

按name分组取最大的两个val: [比当前记录val大的条数]小于2条:即当前记录为为分组中的前两条 > (select count(*) from tb where name = a.nam ...

MYSQL 按某个字段分组,然后取每组前3条记录

先初始化一些数据,表名为 test ,字段及数据为: SQL执行结果为:每个 uid  都只有 3 条记录.   SQL语句为: SELECT   * FROM   test main WHERE   ...

SQL分组取每组前一&lpar;或几&rpar;条记录&lpar;排名&rpar;

mysql分组取每组前几条记录(排名) 附group by与order by的研究 http://www.jb51.net/article/31590.htm --按某一字段分组取最大(小)值所在行的 ...

mysql查询各种类型的前N条记录

mysql查询各种类型的前N条记录,将3改为N(需查询条数)即可  (select * from event_info where event_type = 1  limit 3)union all( ...

mysql获取所有分类的前n条记录的两种方法浅析

项目中有个需求是获取出展会分类下的前n条展商. 刚开始的思路是用group by 获取出展会的分类,后面再根据分类获取该分类下的n个展商,但也需要第一次获取出展会的时候也获取所有的每个展会分类下的 ...

MySQL 分组后取每组前N条数据

与oracle的 rownumber() over(partition by xxx  order by xxx )语句类似,即:对表分组后排序 创建测试emp表 1 2 3 4 5 6 7 8 9 ...

MySQL 先按某字段分组,再取每组中前N条记录

按 gpcode每组 取每组 f4 最大的那条记录: 方法一: select * from calcgsdataflash a where gscode = 'LS_F' and ymd >= ...

随机推荐

使用jquery的小记

随便写点 1.给span这种标签赋值  不能用$("#id").val("abc"); 因为这种标签没有value属性 而应该用$("#id&quot ...

SqlServer更新视图存储过程函数脚本

--视图.存储过程.函数名称 DECLARE @NAME NVARCHAR(255); --局部游标 DECLARE @CUR CURSOR --自动修改未上状态为旷课 SET @CUR=CURSOR ...

Javascript关闭详细说明

在我的博客:http://blog.csdn.net/u011043843/article/details/26148265中也有对闭包的解释 在javascript中闭包是一个非常不好理解的概念.可 ...

shell语法简单介绍

一.基本的语法 1.1.shell文件开头 shell文件必须以以下的行開始(必须方在文件的第一行):  #!/bin/sh  符号#!用来告诉系统它后面的參数是用来运行该文件的程序.在这个样例中我们 ...

PEM文件格式具体解析

PEM文件格式存档 Author:Roson sun sunxiao@tomonline-inc.com Time:2006-4-11 1.  描写叙述: Openssl使用PEM(RFC 1421- ...

ecshop 去版权

与官网通信的几个地方: 1,打开admin/templates/index.htm,查找并删除

java四则运算

题目描述: 从第一章的 "程序" 例子出发,像阿超那样,花二十分钟写一个能自动生成小学四则运算题目的命令行 "软件",满足以下需求: 除 ...

Windows系统FTP Shell

ftp open 10.0.0.0.2 21101 user passwd ls cd pwd delete get /home/err.log Error.log put err.log /home ...

Python Scrapy环境搭建&lpar;一&rpar;

本来是以学习的目的添加了几个QQ群,但是发现群内有着很多的小白都在咨询如何搭建环境的问题,所以我这里把自己搭建的方法分享下 1.首先我们需要查看下自己安装的python的版本; 最简单的版本就是在命令 ...

在用easyui中做CRUD功能时,当删除一行或多行数据后再点击修改会提示你选中了多行,如何解决这个bug了&quest;

在用easyui中做CRUD功能时,当删除一行或多行数据后再点击修改会提示你选中了多行,如何解决这个bug了? 在删除成功后,加上这句话就可以了:$("#dg").datagrid ...

mysql 排序取前4,mysql分组取每组前几条记录(排序)相关推荐

  1. mysql单列去重复group by分组取每组前几条记录加order by排序

    <div class="post"><h1 class="postTitle"><a id="cb_post_title ...

  2. mysql分组取出每组地一条数据_MYSQL实现分组排序并取组内第一条数据

    一.需要实现分组排序并且取组内状态优先级最高的数据 有一张这样的数据表, 需求是根据error_type分组然后取status最小的第一条数据 第一种写法: select t.* from ( sel ...

  3. sql 分组后按时间降序排列再取出每组的第一条记录

    sql 分组后按时间降序排列再取出每组的第一条记录 原文:sql 分组后按时间降序排列再取出每组的第一条记录 竞价记录表: Aid 为竞拍车辆ID,uid为参与竞价人员ID,BidTime为参与竞拍时 ...

  4. mysql分组取出每组地一条数据_基于mysql实现group by取各分组最新一条数据

    基于mysql实现group by取各分组最新一条数据 前言: group by函数后取到的是分组中的第一条数据,但是我们有时候需要取出各分组的最新一条,该怎么实现呢? 本文提供两种实现方式. 一.准 ...

  5. mysql自连接分组查询最新_MySQL 自连接分组取每组最大N条记录

    1.测试数据: create table t2 ( id int primary key, gid char, col1 int, col2 int ) engine=myisam; insert i ...

  6. mysql查询每个用户第一条数据_MySQL数据库订单表按用户邮箱字段分组查询每个用户的第一条记录...

    程序开发或者一些数据统计时,在MySQL中使用GROUP BY分组是很常用的SQL语句.那么,如果如下的简单示例订单数据表,我们现需要使用GROUP BY分组后查询每个用户的第一个订单记录,应该如何实 ...

  7. SQL之Join的使用详解(附 :分组查询每组前N条记录)

    一.基本概念 关于sql语句中的连接(join)关键字,是较为常用而又不太容易理解的关键字,下面这个例子给出了一个简单的解释 –建表user1,user2: table1 : create table ...

  8. mysql中sql批量插入_sql中insert如何批量插入多条记录?

    sql中insert如何批量插入多条记录? sql中insert批量插入多条记录的方法: 常见的insert语句,向数据库中,一条语句只能插入一条数据:insert into persons (id_ ...

  9. mysql 批量更新数据 备份_mysql 批量更新与批量更新多条记录的不同值实现方法...

    批量更新 mysql更新语句很简单,更新一条数据的某个字段,一般这样写: UPDATE mytable SET myfield = 'value' WHERE other_field = 'other ...

最新文章

  1. curl模拟post请求
  2. Asp.net中多项目共享Session
  3. mac终端python不能显示中文_Matplotlib为Mac显示中文,ForMac
  4. Java8 HashMap实现原理探究
  5. 服务器系统ghost版 raid,服务器在raid5下做系统ghost备份.docx
  6. 计算机网络·域名等级及域名服务器的命名
  7. 如何绘制逻辑图 — 9.模型的分类
  8. Linux进程间通信(匿名管道)
  9. 动态调整linux分区大小,GParted 动态调整Linux分区大小
  10. 【iOS开发】理解IBOutlet、Outlet、referencing outlet、outlet connection
  11. 创建计算机桌面快捷方式图标异常,桌面快捷方式图标显示异常,win7无法正常显示桌面图标怎么办?...
  12. 你是《未来世界的幸存者》么?
  13. HYSPLIT模型后向轨迹制作
  14. 综合1:stm32F4,ATKESP8266wifi,DS1302,AT24C02,KEY状态机,LCD屏幕320*240
  15. IDLE Help | 汉化
  16. 葵花宝典之数据结构1800T--2
  17. 《JOEL说软件》中文版翻译质量令人失望
  18. python爬虫——实战篇
  19. lisp调用qleader端点_常用函数.lsp - AutoLISP/Visual LISP 编程技术 - CAD论坛 - 明经CAD社区 - Powered by Discuz!...
  20. 关于提高浏览器渲染页面速度的建议

热门文章

  1. 西南交通大学计算机组成原理,西南交通大学计算机组成原理课程设计报告
  2. Linux中断子系统
  3. CSS文本溢出的处理方法总结
  4. idea+maven打包Java项目
  5. java的IO知识梳理
  6. c语言输入一组小数数组,如何得出一个浮点数的小数部分,要把各个位保存到一个数组里边。...
  7. beoplay耳机序列号查询_BO Beoplay E8评测:真正无线耳机,可自定义EQ设置和透明模式!...
  8. linux rc.local权限,Linux开机启动rc.local不执行分析
  9. MySQL迁移安装_mysql数据库安装路径迁移
  10. html 监听后端变化_SpringBoot2.0整合WebSocket,实现后端数据实时推送!