問題:把衣服、褲子并蝗、褲子祭犯、鞋子這些類別中點(diǎn)擊量最高的一條記錄找出來,并按降序排列滚停!
解題思路:
1. 審題(需要用到的SQL語句)
“衣服盹憎、褲子、帽子铐刘、鞋子這些類別”:進(jìn)行分組 ? ?group by?
“點(diǎn)擊量最高”:復(fù)合函數(shù) ?Max()
“降序排列”:排序關(guān)鍵字 order by ? ? ? 降序 ?desc
需要顯示出來的字段:productID陪每,productName,最高 clickNum
2. ?SQL語句分解
方法1:
首先镰吵,?查詢出點(diǎn)擊量最高的parentID檩禾,并將查詢結(jié)果取別名為b表
select parentid, max(clicknum) clicknum ?FROM productinfo GROUP BY parentid?
查詢結(jié)果如圖:b 表
查詢出表中的productid, productname, clicknum相關(guān)數(shù)據(jù),取別名為a表:
ELECT productid, productname, clicknum FROM productinfo as ?a ;
從a疤祭、b表中查找parentid & clicknum 都相等的數(shù)據(jù):
SELECT a.productid, a.productname, a.clicknum FROM productinfo a, b WHERE a.parentid = b.parentid AND a.clicknum = b.clicknum;
具體SQL圖& SQL語句如下:
方法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:?
方法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
找出productinfo表中 parentid與a表中相等盼产,clicknum比a表中大的數(shù)據(jù):
select 1 from productinfo where a1.parentid = parentid and a1.clicknum < clicknum ?查找出來的結(jié)果相當(dāng)于又新建了一張表,即下面的 c 表勺馆。
為方便理解戏售,將兩表放一起(數(shù)據(jù)都是一樣的):
得到的結(jié)果如下侨核,相當(dāng)于又一個(gè)新表,為方便理解起名為 c 表:
從productinfo表中找c表中沒有的數(shù)據(jù):
select? *? from productinfo? a where not exists ?c
方法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:
簡單數(shù)據(jù)
當(dāng)新增一條特殊記錄
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;
結(jié)果
使用in貪婪匹配搓译,再次查詢
select * from productInfo
where (clickNum, parentID)
in (select max(clickNum),parentID from productInfo group by parentId)
order by clickNum desc
這樣就去除了 parentID的 Max clickNum與另一種parentID 非 Max clickNum相同的特殊情況