这是我的表" puntos":
Equipo Liga Puntos
---------------------------
At. Madrid 1 68
Espanyol 1 64
Barcelona 1 63
Real Madrid 1 61
Castellón 1 48
Murcia 2 78
Elche 2 70
Sevilla 2 60
Valladolid 2 57
我只想获得每个属性的不同值的两行" Liga",两个具有最大值" Puntos"分组来自" Liga"。
所以它应该返回类似的东西:
Equipo Liga Puntos
---------------------------
At. Madrid 1 68
Espanyol 1 64
Murcia 2 78
Elche 2 70
我通过该查询获得结果:
SELECT * FROM puntos GROUP BY Liga HAVING max(puntos)
UNION
SELECT p1.Equipo, p1.Liga, max(p1.puntos) FROM puntos p1, (SELECT * FROM puntos GROUP BY Liga HAVING max(puntos) ORDER BY Liga,puntos DESC) p2
WHERE p1.Liga=p2.Liga AND p1.puntos<p2.puntos GROUP BY Liga
ORDER BY Liga,puntos DESC
但是,如果列的选择值&#34; puntos&#34;是平等的。
对于任何值,是否有其他方法可以做到这一点?
答案 0 :(得分:0)
首先,只有Equipo
在所有联赛中都是唯一的,此解决方案才有效。如果不是 - 您应该添加equipoID
并改为使用它。
现在,我们首先选择每个联赛的领导者。然后再次创建一个具有相同选择的联合,只使用WHERE过滤掉我们在第一个联合中已经获得的团队。这基本上会给我们追随者。
以下是查询:
SELECT * FROM
(SELECT * FROM puntos ORDER BY `liga`,`puntos` DESC) `leader`
GROUP BY `liga`
UNION
SELECT * FROM
(SELECT * FROM puntos ORDER BY `liga`,`puntos` DESC) `follower`
WHERE `follower`.`equipo` NOT IN
(SELECT equipo FROM
(SELECT * FROM puntos ORDER BY `liga`,`puntos` DESC) `leader`
GROUP BY `liga`
)
GROUP BY `liga`
ORDER BY `liga`
答案 1 :(得分:0)
获取最大的puntos
SELECT Equipo, Liga, max(Puntos) Puntos FROM results GROUP BY Liga
然后从点移除Liga的最大值并再次获得最大值
SELECT Equipo, Liga, max(Puntos) Puntos FROM results A
WHERE Puntos NOT IN
(SELECT max(Puntos) Puntos FROM results B
WHERE A.LIGA = B.LIGA
GROUP BY Liga)
GROUP BY Liga
将整个选择换行以对列进行排序
SELECT Equipo, Liga, Puntos
FROM
(SELECT Equipo, Liga, max(Puntos) Puntos FROM results GROUP BY Liga
UNION
SELECT Equipo, Liga, max(Puntos) Puntos FROM results A
WHERE Puntos NOT IN
(SELECT max(Puntos) Puntos FROM results B
WHERE A.LIGA = B.LIGA
GROUP BY Liga)
GROUP BY Liga) T
ORDER BY Liga ASC, Puntos DESC
检查SqlFiddle。
答案 2 :(得分:0)
另一种选择是使用9.4 User-Defined Variables:
SELECT
`der`.`Equipo`,
`der`.`Liga`,
`der`.`Puntos`
FROM (
SELECT
`p`.`Equipo`,
`p`.`Liga`,
`p`.`Puntos`,
IF(@`prev_liga` != `p`.`Liga`,
@`rownum` := 1,
@`rownum` := @`rownum` + 1
) `rank`,
@`prev_liga` := `p`.`Liga`
FROM (
SELECT
`Equipo`,
`Liga`,
`Puntos`
FROM `puntos`
GROUP BY `Liga`, `Puntos`
ORDER BY `Liga`, `Puntos` DESC
) `p`, (SELECT
@`rownum` := NULL,
@`prev_liga` := 0) `r`
) `der`
WHERE `der`.`rank` <= 2
ORDER BY `der`.`Liga`, `der`.`rank`;
来自同一队的两支球队&#34; Liga&#34;平等&#34; Puntos&#34;:
SELECT
`der`.`Equipo`,
`der`.`Liga`,
`der`.`Puntos`
FROM (
SELECT
`p`.`Equipo`,
`p`.`Liga`,
`p`.`Puntos`,
IF(@`prev_liga` != `p`.`Liga`,
@`rownum` := 1,
@`rownum` := @`rownum` + 1
) `rank`,
@`prev_liga` := `p`.`Liga`
FROM (
SELECT
`Equipo`,
`Liga`,
`Puntos`
FROM `puntos`
ORDER BY `Liga`, `Puntos` DESC
) `p`, (SELECT
@`rownum` := NULL,
@`prev_liga` := 0) `r`
) `der`
WHERE `der`.`rank` <= 2
ORDER BY `der`.`Liga`, `der`.`rank`;
答案 3 :(得分:0)
您好我会建议对此问题采取不同的方法。
SET @num := 0, @liga := 0;
SELECT Equipo, Liga, Puntos
FROM (SELECT Equipo, Liga, Puntos, @num := if(@liga = Liga, @num + 1, 1) AS rowNumber,
@liga := Liga
FROM (SELECT Equipo, Liga, Puntos
FROM results
ORDER BY Liga, Puntos DESC) t1) tx
WHERE rowNumber <= 2;
此处SQL Fiddle也可以看到它是如何运作的......
here你可以看一下我以前的一个(非常相似的答案)!
GL!