MySQL燕十八老师课程笔记:第十课:order by 与 limit 详解

在PHP中,获取不同栏目的商品:在地址栏上获取$_GET[‘id’]

select goods_id,cat_id,goods_name from goods
where cat_id = 5;

排序是针对最终结果集的。即当最终结果集出来后,order by 要放在 where\group\having 的后面

# 取出第四个栏目下的商品,并按价格由高到低排序
select goods_id,goods_name,shop_price from goods
where cat_id=4
order by shop_price desc;   
# desc表示由高到低降序排列。
# asc 表示升序排列,默认升序排列。
# 按发布时间升序排列,即发布时间早的,时间戳小的,靠前。
select goods_id,goods_name,shop_price
from goods where cat_id=4
order by add_time asc;
# 按栏目排序:
select goods_id,cat_id,goods_name,shop_price
from goods order by cat_id asc;
# 但是这样排序仍然并不规律,只是按照栏目大致排序。
# 我们按栏目升序排列,同一个栏目下的商品,再按商品的价格降序排列
select goods_id,cat_id,goods_name,shop_price
from goods order by cat_id asc,shop_price desc;
# 多字段同时需要排序时,直接用逗号隔开即可。

多字段排序也很容易:order by 列1 desc/asc,列2 desc/asc,列3 desc/asc……

limit:限制条目

# 取第三个栏目下的前十名
select goods_id,cat_id,goods_name,shop_price
from goods
where cat_id = 3
order by shop_price asc
limit 10;

limit 在语句的最后,起到限制条目的作用。
limit [offset,] N
offset:偏移量
N:取出条目
offset,如果不写,则相当于 limit 0,N 中括号表示可选条目

# 查询出本店价格最高的前三名:
select goods_id,goods_name,shop_price
from goods
order by shop_price desc
limit 0,3;
# 查询出本店价格最高的 第三名到第五名 商品
# 取第3到第5,即意味着跳过 第一、第二,因此偏移量 offset=2
# 取第 345条,即取3条,因此N=3
select goods_id,goods_name,shop_price
from goods
order by shop_price desc
limit 2,3;
# limit 计数从0开始。

offset:跳过的行数,N:实际取出的行数

# 取出价格最高的那个商品
# 思路1:按商品价格降序排列,最高的排前面,取一个,即第一名。
select goods_id,goods_name,shop_price
from goods
order by shop_price desc
limit 0,1;       # 如果offset为0,可以不写
# 即最后一句可以写为:
limit 1;

5个子句的作用顺序:
where group having order by limit

练习:
查询出每个栏目下 goods_id号最大(最新)的一条商品

# 我的答案:
select goods_id,cat_id,goods_name,shop_price
from goods group by cat_id
order by goods_id desc limit 1; 
# 错误:select goods_id,cat_id,goods_name,shop_price from goods 
# group by cat_id  这句话直接会取出每个 cat_id 的第一个,
# 且每个cat_id只显示那第一个,其他列的值取得是cat_id第一个那一行。
# 另一种错误:
select max(goods_id),cat_id,goods_name
from goods
group by cat_id;
# 错误:老版本的MySQL中,会取出正确的goods_id,
# 但是goods_name仍然取的是cat_id里第一次遇到的那个。两者不匹配。
# 在新版本中,这种写法会直接报错。
# 还有一种错误:
# 试图先order by,再group,但是这样语法就通不过的,group 要在order by 前面。

标准答案::必须使用子查询!!

select goods_id,cat_id,goods_name from
(select goods_id,cat_id,goods_name from goods
order by cat_id asc,goods_id desc) as temp
group by cat_id;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值