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
效果图: