In my database, I have table wp_postmeta
, example:
| meta_key | meta_value | post_id |
---------------------------------
points | 12 | 23
points | 2 | 18
lorem | ipsum | 92
points | 8 | 15
I want to order points
by meta_value
and get the row number of a specific post_id
. Basically a rank system, with highest number at the top.
For example, ordering points
by meta_value
:
| meta_key | meta_value | post_id |
---------------------------------
points | 12 | 23
points | 8 | 15
points | 2 | 18
post_id
with value 15
will be rank 2.
What SQL query can I run to achieve this with optimisation in mind?
What I've tried so far
I have achieved this via query:
$query="
SELECT post_id,FIND_IN_SET(
post_id,(SELECT GROUP_CONCAT( post_id ORDER BY meta_value * 1 DESC)
FROM $wpdb->postmeta
WHERE meta_key ='points')
) AS `rank`
FROM $wpdb->postmeta
WHERE meta_key ='points'
AND post_id = '".$post_id."'
";
$result = $wpdb->get_row($query);
$rank = $result->rank;
Works fine. However, this query is very slow.
How can I make this query faster?
EDIT: Here is a list of indexes in this table: