Ranking mysql and query for one people - php

I use this script for my ranking. But I'm not good in MYSQL so maybe someone can help me to change this script to add to this variable:
WHERE id = '$id'
This is what i use:
SELECT id,punkty,
#curRank := #curRank + 1 AS rank
FROM users p, (SELECT #curRank := 0) r
ORDER BY punkty DESC;
I dont know how I can change this script to check one id ? (where id = '$id')

As from comments what i understand the rank given by your query against each user,now you want to know the rank for a given user. You can get the desired rank for the given user's id by doing a sub select
SELECT * FROM (
SELECT id,punkty,
#curRank := #curRank + 1 AS rank
FROM users p, (SELECT #curRank := 0) r
ORDER BY punkty DESC
) t
WHERE id='6';
In below demo if you see the second result set,it shows all the users with their rank and the first query is for one user with id = 6 and his rank is 4 according to the result set of second query
Demo

Related

How to get rank position from MySQL SELECT statement

I'm trying to get the rank value of a MySQL SELECT statement, (MySQL is not something I'm too familiar with).
This query give me the correct results I am looking for in the correct order (by greater number of stats), but I need to get a particular value from the results.
SELECT id, stats,
#curRank := #curRank + 1 AS rank
FROM statistics.web_stats p, (SELECT #curRank := 0) r
ORDER BY stats DESC;
Gives me this expected result:
id,stats,rank
999,291,1
1137,82,2
1084,79,3
1111,60,4
1097,55,5
1094,51,6
1109,50,7
1112,49,8
1154,44,9
1082,36,10
What I need to do it get the rank value of any particular id, for example, in my PHP code, how would I find the rank position of id 1111 (to return the rank value of '4')?
I'm stuck with hoe to further extract values from the results. Do I need to save them somehow, or can I further expand the MySQL query?
Thanks.
You can use any one of the solutions:
You need to use a subquery to maintain rank position.
This will give you a result whose rank is 4:
SELECT *
FROM
(
SELECT id, stats,
#curRank := #curRank + 1 AS rank
FROM statistics.web_stats p, (SELECT #curRank := 0) r
ORDER BY stats DESC
) AS stat
WHERE rank = 4;
You can even use LIMIT OFFSET to query as they are already in order:
SELECT id, stats,
#curRank := #curRank + 1 AS rank
FROM statistics.web_stats p, (SELECT #curRank := 0) r
ORDER BY stats DESC
LIMIT 4, 1

I want to get ranking number in Laravel

I want to get ranking number in Laravel.
DB is here.
id Bigint
name string
point BigInt
.....
I want to get ranking number in point column.
What should I do?
now code is this.
User::where('id', 1)->first();
if I have these datas.
id name score ...
1 AA 10
2 CD 10
3 ER 40
4 DR 5
I want to get ranking number
ex) id 1 => 2 (or3)
ex) id 3 => 1
You can get the rank as below:
User::selectRaw("SELECT id, name, point, FIND_IN_SET( point, (
SELECT GROUP_CONCAT( DISTINCT point ORDER BY point DESC ) FROM
user )
) AS rank
FROM user")
->get()
Try this. Here is the raw query :
SELECT id,name,point,
#curRank := #curRank + 1 AS rank
FROM user u, (SELECT #curRank := 0) r
ORDER BY point;
You can write it in laravel as follows :
DB::select("SELECT id,name,point,
#curRank := #curRank + 1 AS rank
FROM user u, (SELECT #curRank := 0) r
ORDER BY point;");

Loop through rows until you find a variable and then count the number of rows

I'm building a rank system, I have many horses and on the horse profiles I want to echo the rank of the horse depending on the amount of wins. 1st, 2nd, 3rd etc.
This is my MySQL table containing the horses, in PHP how would I count the rows to get the rank of the horse?
Here's my table, for instance if I was on "Pauls" profile, how would I echo out that he is in 4th position in the global ranking?
1.
select h.*, #rownum := #rownum + 1 AS rank
from horses h, (SELECT #rownum := 0) r
order by h.first DESC, h.second DESC, h.third DESC
2.
SELECT * FROM
(
select h.*, #rownum := #rownum + 1 AS rank
from horses h, (SELECT #rownum := 0) r
order by h.first DESC, h.second DESC, h.third DESC
) t
WHERE id = 428
Two queries to get position of your search record
set #name='Paul',#nr = 0, #namenr = 0;
select #namenr as nr from
(SELECT #nr:=#nr+1,if(name=#name, #namenr := #nr,#namenr=#namenr),name FROM SOME_TABLE order by first DESC ) subsel where subsel.name = #name;
second query will return one record with nr column which you are looking for.
Depending on your scoring system, this could be the right solution for you:
Say your 'first' means 3 points, 'second' means 2 points and and 'third' means 1 point.
This way you can calculate what horse has the most points based on the total.
Example:
Paul has 2 'first', 0 'second' and 1 'third', scoring him to 7 points.
Fletcher has 2 'first', no 'second' and no 'third', scoring him to 6 points.
Calculate the sum of all the points and order it by that field, DESC.
Example query:
SELECT (`first`*3)+(`second`*2)+(`third`*1) AS `total_score` FROM `horses` ORDER BY `total_score` DESC
Additional 'rank' field
SET #rank=0;
SELECT #rank:=#rank+1 AS `rank`, (`first`*3)+(`second`*2)+(`third`*1) AS `total_score` FROM `horses` ORDER BY `total_score` DESC
With the following query you can have your table, and next to it the rank of each horse:
SELECT *,
#curRank := #curRank + 1 AS rank
FROM (SELECT #curRank := 0) r, horses
order by first desc, second desc, third desc
I am using the (SELECT #curRank := 0) to initialize the curRank within the query
Use Order By on multiple columns according to priority.
$sql = "SELECT
#rownum := #rownum + 1 as row_number
FROM horses
CROSS JOIN (SELECT #rownum := 0) r
WHERE name = "Paul"
ORDER BY
first ASC,
second ASC,
third ASC";
now you can obtain the position value from query for any users.
To get the rank of a particular horse, you need only count the number of records that rank above it; sorting by row constructors is a very concise way of accomplishing this:
SELECT COUNT(*) + 1
FROM horses
WHERE (first, second, third)
> (SELECT first, second, third FROM horses WHERE id = ?)

PHP Ranking and updating all database rows

Trying to rank the rows in my table and then update a field in each row with its rank number. The ranking will be based on a field with a points value.
The database structure is as follows:
Table name: blogs
fields: ID, buildpointsNow, build_rank
I want to run a cron job that will rank each row depending on its buildpointsNow value and then update its build_rank with that rank number.
So far i have tried:
UPDATE blogs
JOIN (SELECT p.id,
#curRank := #curRank + 1 AS rank
FROM blogs p
JOIN (SELECT #curRank := 0) r
ORDER BY p.buildpointsNow DESC
) ranks ON (ranks.id = blogs.id)
SET blogs.build_rank = blogs.build_rank;
And also:
update blogs cross join
(select #rn := 0) vars
set build_rank = (#rn := #rn + 1);
order by buildpointsNow;
Both of these throw no errors and do update the database rows. However they do not order the builds rank depending on the buildpointsNow field. They instead update each row in its order of creation / its ID.
Any ideas?
blogs need to be ordered by buildpointsNow before adding #curRank:
update blogs
join (
select p.id, #curRank := #curRank + 1 as rank
from (select id from blogs order by buildpointsNow) p
join (select #curRank := 0) r) ranks on ranks.id = blogs.id
set blogs.build_rank = ranks.rank;
Demo
Create a separate table and store ranking order there. You need a column with post_id and one with score. Every time you add/subtract points from score modify that column. And when you need to display the posts in ranking order, just sort that second lighter table table and join the posts heavier table.
Also make sure you index the score column.

Get rank of player from mysql query

I found some good answers for this question, but I can't really get them to work.
I wan't to get a players rank from a hiscore table.
id name score
1 John 10
2 Linda 5
3 Emmy 25
I want to pass in a name in the query (Linda) and get her rank (She only have 5 points in the table above), and get her rank (nr 3).
I found a similar question with this answer, but don't understand it:
SELECT uo.*,
(
SELECT COUNT(*)
FROM users ui
WHERE (ui.points, ui.id) >= (uo.points, uo.id)
) AS rank
FROM users uo
WHERE id = #id
Thanks in advance
SELECT (COUNT(*) + 1) AS rank FROM hiscore WHERE score > (SELECT score FROM hiscore WHERE name = 'Linda')
Try this query -
SELECT name, score, rank FROM
(SELECT *, #r:=#r + 1 rank FROM table_name ORDER BY score DESC) t1,
(SELECT #r:=0) t2
WHERE name = 'Linda'
SET #rownum := 0;
SELECT rank, name, score
FROM
(SELECT #rownum := #rownum + 1 AS rank, name, score
FROM players
ORDER BY score DESC)

Categories