I\'m having problems running a query ranking. The inner SELECT gives the rows in order of ranking, for each line, the variable @rank increases, if not a position equal to th
First, Thank you all!
I found a way to return the expected result making other selects 2
A) Select first grouped and ordered
SELECT
SUM( a.value ) AS SUM_VALUES,
b.id AS b_id,
b.name AS b_name
FROM
a INNER JOIN b ON ( a.b_id = b.id )
GROUP BY b.id
ORDER BY SUM_VALUES DESC
B) I do this ranking list
SELECT
R.*,
@prev := @curr,
@curr := R.SUM_VALUES,
@rank := IF(@prev = @curr, @rank, @rank+1) AS rank
FROM (
SELECT
SUM( a.value ) AS SUM_VALUES,
b.id AS b_id,
b.name AS b_name
FROM
a INNER JOIN b ON ( a.b_id = b.id )
GROUP BY b.id
ORDER BY SUM_VALUES DESC
) AS R
C) And lastly, just select what matters
SELECT
Ranking.b_id,
Ranking.b_name,
Ranking.rank
FROM
(
SELECT
R.*,
@prev := @curr,
@curr := R.SUM_VALUES,
@rank := IF(@prev = @curr, @rank, @rank+1) AS rank
FROM (
SELECT
SUM( a.value ) AS SUM_VALUES,
b.id AS b_id,
b.name AS b_name
FROM
a INNER JOIN b ON ( a.b_id = b.id )
GROUP BY b.id
ORDER BY SUM_VALUES DESC
) AS R
) AS Ranking
WHERE
Ranking.b_id = 1
The result of this query was:
+------+--------+------+
| b_id | b_name | rank |
+------+--------+------+
| 1 | AAA | 2 |
+------+--------+------+
having
It will be slow, but a having
clause will run after all the selects, joins, where and group by's have finished and are fully resolved.
The only problem is that having
does not use an index, whilst where
does use an index.
SELECT
ranking stuff
FROM
lot of tables
WHERE simple_condition
HAVING filters_that_run_last
Make your joins explicit
Note that you don't have to mix explicit and implicit joins.
If you want a cross join, you can use the cross join
keyword.
....
) AS Ranking
CROSS JOIN (SELECT @curr := null, @prev := null, @rank := 0) InitVars
WHERE
Ranking.regional_id = 1003