This is team table :
---- ------- -------- -------
| id | alias | pwd | score |
---- ------- -------- -------
| 1 | login | mdp | 5 |
| 2 | azert | qsdfgh | 50 |
| 3 | test | test | 780 |
---- ------- -------- -------
This is activity table
---- -------------- --------------------- ------- --------
| id | localisation | name | point | answer |
---- -------------- --------------------- ------- --------
| 1 | Madras | Lancement du projet | 0 | NULL |
| 2 | Valparaiso | act1 | 450 | un |
| 3 | Amphi | act2 | 45 | deux |
| 4 | Amphix | act3 | 453 | trois |
| 5 | Amphix | act4 | 45553 | qautre |
| 6 | Madras | Lancement du projet | 0 | NULL |
| 7 | Valparaiso | act1 | 450 | un |
| 8 | Amphi | act2 | 45 | deux |
| 9 | Amphix | act3 | 453 | trois |
| 10 | Amphix | act4 | 40053 | fin |
---- -------------- --------------------- ------- --------
This is feed table :
-------- --------------------- ------------ --------
| FeedId | ts | ActivityId | TeamId |
-------- --------------------- ------------ --------
| 1 | 2023-01-10 00:02:06 | 1 | 3 |
| 2 | 2023-01-10 00:02:28 | 2 | 3 |
| 3 | 2023-01-10 00:21:13 | 3 | 3 |
| 4 | 2023-01-10 00:24:49 | 3 | 3 |
| 5 | 2023-01-10 00:30:58 | 1 | 1 |
-------- --------------------- ------------ --------
I did this
MariaDB [sae]> SELECT @rownum:=@rownum 1 as 'Classement', t.alias, SUM(a.point) as total_points FROM activity a INNER JOIN feed f ON a.id = f.ActivityId INNER JOIN team t ON f.TeamId = t.id JOIN (SELECT @rownum:=0) r GROUP BY t.alias ORDER BY total_points DESC, Classement DESC;
------------ ------- --------------
| Classement | alias | total_points |
------------ ------- --------------
| 2 | test | 540 |
| 1 | login | 0 |
------------ ------- --------------
Here the team with the highest number of points contains the ranking 2 instead of one and if I sort by ASC Ranking it does not change anything.
I wish to this :
------------ ------- --------------
| Classement | alias | total_points |
------------ ------- --------------
| 1 | test | 540 |
| 2 | login | 0 |
------------ ------- --------------
Do you have any idea how to go about incrementing this "backwards" integer?
CodePudding user response:
Using the same logic as yours, You can do it as follows :
select @rownum:=@rownum 1 as 'Classement', s.*
from (
SELECT t.alias, SUM(a.point) as total_points
FROM activity a
INNER JOIN feed f ON a.id = f.ActivityId
INNER JOIN team t ON f.TeamId = t.id
JOIN (SELECT @rownum:=0) r
GROUP BY t.alias
ORDER BY total_points DESC
) as s;
Check it here : https://dbfiddle.uk/TEz3UT97
Its working on mysql and mariadb
CodePudding user response:
Unless you are using an eoled version of MariaDB you should use WINDOW function RANK() instead of dealing with user variables.
Working with user variable increment returns the same value as ROW_NUMBER() but this is not correct, since teams with the same score should get the same ranking.
SELECT RANK() OVER (ORDER BY subq.total_points DESC) AS 'Classement',
subq.* FROM (
SELECT team.alias, SUM(activity.point) AS total_points FROM activity
JOIN feed ON activity.id = feed.ActivityId
JOIN team ON feed.TeamId = team.id GROUP BY team.alias ) AS subq