根据例题对Group by ,having以及count(*)的理解

三表联立
Q;查询某类别(T_category表的某category_id字段)下评论数(T_category_review表的Review字段) >=3条的所有产品的名称(T_product表的Product_name字段)

A:
根据中文要求切入点:
为T_product_review表的T_c_Product_id(产品名称),
此字段可以区分不同产品(Product_id),
进而将相同的产品(Product_id)的评论(Review)归为一类!!!

一.首先:了解Group BY的作用
通俗理解:将SQL语句查询的Group BY xxx中的xxx字段,根据不同的字段内容分别"压缩"在不同的"盒子"
在这里插入图片描述
如果查询联立表的其他字段(即 根据 产品类别(电器类) 查询 产品名称)

例一>
 SELECT t.Product_name 产品名称 
from T_product t,t_category c
 where  c.Category_id=t.T_C_Category_id and c.Category_name='电器类'
 
 GROUP BY c.Category_id

结果:只会显示该类别中联立表的第一行数据****(即只能根据 电器类 查询到 电视 一条产品数据)

问题来了,如果我查询电器类的所有产品信息怎么办呢?!
(重点在group by的字段改变)

即c.Category_id变为 t.Product_id

即可查出所有产品

例二>
 SELECT t.Product_name 产品名称 
from T_product t,t_category c
 where  c.Category_id=t.T_C_Category_id and c.Category_name='电器类'
 
 GROUP BY  t.Product_id

是不是搞蒙了?我当时也是
但是我细细总结

group by后的字段

1. 有外键的主键(pk)

见例一>

则会根据主键(电器类id)查询其外键在外键表的第一行信息(电视的信息)

2.如果 是外键(fk)

例二>

则会根据外键表(外键的电器类id)的所有信息(电视,冰箱,空调等信息)

3. 无外键的主键(pk)

group by没有意义!!!

然后我们根据 T_category_review表将同一个类别的产品(电视,冰箱…)group by"压缩"在一起,
这时候count()就能起作用了,
having 和where的作用一样,但having只能与group by成对存在…
count(
)数量就是该类别产品的评论数量了!!!

  SELECT t.Product_name 产品名称, count(*) 评论数量 
 				 from T_product t,  t_product_review r
 	where t.Product_id=r.T_c_Product_id
 	 GROUP BY r.T_c_Product_id 
	HAVING count(r.T_c_Product_id)>=3

效果图:
在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章