在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
# 取第 3,4,5条,即取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;