一道很有技术含量的SQL面试题,多方法全方位完美解答

问题:把衣服、裤子、裤子、鞋子这些类别中点击量最高的一条记录找出来,并按降序排列!

一道很有技术含量的SQL面试题,多方法全方位完美解答_第1张图片
题目数据表


一道很有技术含量的SQL面试题,多方法全方位完美解答_第2张图片
查询结果图

解题思路:

1. 审题(需要用到的SQL语句)

“衣服、裤子、帽子、鞋子这些类别”:进行分组    group by 

“点击量最高”:复合函数  Max()

“降序排列”:排序关键字 order by       降序  desc

需要显示出来的字段:productID,productName,最高 clickNum

2.  SQL语句分解

方法1:

首先,�查询出点击量最高的parentID,并将查询结果取别名为b表

select parentid, max(clicknum) clicknum  FROM productinfo GROUP BY parentid 

查询结果如图:b 表

一道很有技术含量的SQL面试题,多方法全方位完美解答_第3张图片
b表

查询出表中的productid, productname, clicknum相关数据,取别名为a表:

ELECT productid, productname, clicknum FROM productinfo as  a ;

一道很有技术含量的SQL面试题,多方法全方位完美解答_第4张图片
a 表

从a、b表中查找parentid & clicknum 都相等的数据:

SELECT a.productid, a.productname, a.clicknum FROM productinfo a, b WHERE a.parentid = b.parentid AND a.clicknum = b.clicknum;

一道很有技术含量的SQL面试题,多方法全方位完美解答_第5张图片
比对后的结果

具体SQL图& SQL语句如下:

一道很有技术含量的SQL面试题,多方法全方位完美解答_第6张图片
方法1

方法1 SQL如下

SELECT a.productid, a.productname, a.clicknum

FROM productinfo a,(

SELECT parentid, max(clicknum) clicknum 

FROM productinfo GROUP BY parentid ) b

WHERE a.parentid = b.parentid AND a.clicknum = b.clicknum

ORDER BY a.clicknum DESC;


方法2: 

一道很有技术含量的SQL面试题,多方法全方位完美解答_第7张图片
方法2

方法2 SQL如下:

SELECT p.productid, p.productname, p.clicknum

FROM class c

JOIN (

SELECT * FROM productinfo p WHERE  clicknum = (

SELECT max(clicknum) FROM productinfo

WHERE parentid = p.parentid )

) p ON c.classid = p.parentid

ORDER BY p.clicknum DESC;


方法3:

新建表a1:   select  *  from productinfo  a1


一道很有技术含量的SQL面试题,多方法全方位完美解答_第8张图片
a1表

找出productinfo表中 parentid与a表中相等,clicknum比a表中大的数据:

select 1 from productinfo where a1.parentid = parentid and a1.clicknum < clicknum  查找出来的结果相当于又新建了一张表,即下面的 c 表。

为方便理解,将两表放一起(数据都是一样的):

一道很有技术含量的SQL面试题,多方法全方位完美解答_第9张图片
两表对比

得到的结果如下,相当于又一个新表,为方便理解起名为 c 表:

一道很有技术含量的SQL面试题,多方法全方位完美解答_第10张图片
c 表


从productinfo表中找c表中没有的数据:

select  *  from productinfo  a where not exists  c


一道很有技术含量的SQL面试题,多方法全方位完美解答_第11张图片
方法3 

方法3 SQL如下:

select  *  from productinfo  a

where not exists (

select 1 from productinfo

where

a.parentid = parentid

and clicknum > a.clicknum

)

order by clicknum desc;



方法4:

简单数据

一道很有技术含量的SQL面试题,多方法全方位完美解答_第12张图片
数据简单的方法4,不可取


当新增一条特殊记录

insert into productInfo (productID, productName, parentID, clickNum) values (10,'女士鞋子1',10,30);

再次查询

select * from productinfo where clicknum in (select max(clickNum) from productinfo group by parentid) order by clicknum desc;

结果

一道很有技术含量的SQL面试题,多方法全方位完美解答_第13张图片
该条记录不应出现

使用in贪婪匹配,再次查询

select * from productInfo

where (clickNum, parentID)

in (select max(clickNum),parentID from productInfo group by parentId)

order by clickNum desc

一道很有技术含量的SQL面试题,多方法全方位完美解答_第14张图片
使用in贪婪匹配(正确的方法4)

这样就去除了 parentID的 Max clickNum与另一种parentID 非 Max clickNum相同的特殊情况

你可能感兴趣的:(一道很有技术含量的SQL面试题,多方法全方位完美解答)