在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;
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 *
会取栏目遇到第一种商品。
另一种错误
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
查出本网站最新的商品一条,要求不能用排序
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;