燕十八公益课堂总结~

在php中获取不同栏目的商品,通过地址栏上获取$_GET['id']
ecshop商品首页商品列表价格排序方式
把having形成的结果集进行排序,也只能对结果集进行排序,
我们可以对最终结果集再排序,反过来说,排序是针对最终结果集的。
即:order_by要放在where/group/having的后面,顺序是不能
乱的。

order by 当最终结果集出来以后,可以进行排序。
例:查询第四栏目的商品,并按价格降序排列
select goods_id,goods_name,shop_price from goods
where cat_id=4;

为什么和商城取出的结果不一样呢?比商城多取了一个商品
因为其属性is_delete为1,表示已经删除。是逻辑删除,并没有正常从数据库删除,这是
回收站机制。因为我们的表没有is_delete和is_on_sale字段,所以
所取数据有不同是正常的。
select goods_id,goods_name,shop_price from goods
where cat_id=4
order by shop_price desc;
上面的语句就是用shop_price进行降序排列。

排序的语法:
Order by 结果集中的列名  desc/asc (降序/升序)
例:order by shop_price desc;

某一本书:
编著:
张三
李四
王五(排名不分先后)

某个论坛(会议),出席会议专家james jack haimeimei
排名不分先后,按姓名拼音排序。
有没有可能出现按拼音排序,两个人的拼音一样,区分不出来先后。
当然有:有个女叫张力,再有个男的叫张立,拼音都是zhangli。

按栏目排序,就会出现在如上的情况,因为同一个栏目的商品很多。
select goods_id,goods_name,shop_price,cat_id from goods
order by cat_id desc;
我们按栏目升序排列,同一个栏目下的商品,再按商品的价格降序排列
select goods_id,goods_name,shop_price,cat_id
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[offset],N
offset :偏移量
N:取出条目
Offset 如果不写相当于

例:
取出价格最贵的三种商品在。
select goods_id,cat_id ,goods_name,shop_price
from goods
oder by shop_price desc
limit 0,3;

取出本店最高的第三名到第五名的商品,即意味着跳过第1名
第2名因此偏移量offset是2,取第三、四、五条,共三条
select goods_id,cat_id ,goods_name,shop_price
from goods
oder by shop_price desc
limit 2,3;

从上可以看出offset是跳过的行数,N是取出的行数。


取出价格最高的商品,思路:按价格降序排列,最高的排前面,
取1个,即第一名。

select goods_id,cat_id ,goods_name,shop_price
from goods
oder by shop_price desc
limit 0,1 ;

如查offset为0,可以不写,即下语句,也是取出价格最高的的商品
select goods_id,cat_id ,goods_name,shop_price
from goods
oder by shop_price desc
limit 1;

五个组句的排序为where,group by, having,order by,li mit

查询出每个栏目下id号最大(最新)的一条商品。

第一种错误,直接group by cat_id
SELECT *    FROM `goods`    WHERE 1    GROUP BY `cat_id`    ORDER BY `id` DESC

会取栏目遇到第一种商品。

另一种错误
select max(goods_id),cat_id,goods_name
from goods
group by cat_id;
group by cat_id,在select 聚合函数中应该是cat_id

还有一种错误
我们这么想既然group时,mysql是取每个分组下第一次出现的行
我就先把goods_id最大的排前面
select goods_id,cat_id,goods_name from goods
ordery by cat_id asc,goods_id desc;
在这个基础上,我再一分组,不就行了么?于是,先order再group
select goods_id,cat_id,goods_name from goods
ordery by cat_id asc,goods_id desc
group by cat_id;
会出现语法错误,因为五种组句查询是有严格顺序的。

三、接下来学习子查询
查出本网站最新的商品一条
select goods_id,cat_id,goods_name from goods
order by goods_id desc
limit 1
思路:按goods_id   desc排序,再取一行。

查出本网站最新的商品一条,要求不能用排序
select goods_id,cat_id,goods_name from goods
where goods_id = (select max(goods_id) from goods);

用where型子查询,查询每个栏目下goods_id
最大的商品
第一步,先查出每个栏目下最大的商品
select max(goods_id),cat_id,goods_name from goods
group by cat_id;

下一步,我们只要把goods_id=16,32,....的这几条商品取出来

select goods_id,cat_id,goods_name from goods
where goods_id in(select max(goods_id) goods_name from goods
group by cat_id);

where 型子查询
如果 where =(内层sql),只是一行数据
如果 where in(内层sql),是多行数据


from 型子查询
查询结果集在结构上可以当做表看
即,内层sql的查询结果,当成一张临时表,供外层继续查询

查询每个栏目下,goods_id最大的商品
select * from(
select goods_id,cat_id,goods_name from goods
order by cat_id asc,goods_id desc
)as temp group by cat_id;


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值