реальный ранг в MySQL и переполнении стека

Я делаю простой SQL-запрос:

SELECT `name`, `likes`
FROM `social`
WHERE `month` = '2015-01'
ORDER BY `likes` DESC

Затем я добавляю «Ранж», который является целым числом с ++

$data = array();
$rank = 0;
while ($table_row = mysqli_fetch_assoc($table)) {
$rank++;
$data[$table_row['name']] = $table_row;
$data[$table_row['name']]['rank'] = $rank;
}

Результат слева и то, что я хочу на правой стороне

+------+------+-------+    +------+------+-------+
| rank | name | likes |    | rank | name | likes |
+------+------+-------+    +------+------+-------+
|    1 | foo  |   123 |    |    1 | foo  |   123 |
|    2 | mfoo |    33 |    |    2 | mfoo |    33 |
|    3 | xfoo |    33 |    |    2 | xfoo |    33 |
|    4 | yfoo |    30 |    |    4 | yfoo |    30 |
|    5 | zfoo |    29 |    |    5 | zfoo |    29 |
+------+------+-------+    +------+------+-------+

как мне достать правый столик? есть ли способ решить это в запросе?

РЕДАКТИРОВАТЬ:

Там я стою сейчас:

select IF(@likes=s.likes, @rownum, @rownum:=@rownum+1) rank2,
s.domain_name, s.likes,
(@likes:=s.likes) dummy
from social s,
(SELECT @rownum:=0) x,
(SELECT @likes:=0) y
WHERE `month` = '2015-01'
order by likes desc

но рейтинг не на 100% правильный, потому что я хочу пропустить рейтинг вместо того, чтобы считать через

2

Решение

Я вижу, что здесь происходит.
Я не знаю о лучших практиках, но я бы, наверное, сделал что-то подобное сам:

$data = array();
$rank = 0;
$lastlike = 1;
$currentlike = 0;
$i = 0;
while ($table_row = mysqli_fetch_assoc($table)) {

$name = $table_row['name'];
$currentlike = $table_row['likes'];
if ($currentlike != $lastlike) $rank++;
$data[$i] = array('rank'=>$rank,'name'=>$name,'likes'=>$currentlike);
$lastlike = $currentlike;
$i++;
}

Я не проверял это, но вы можете попробовать и посмотреть.

0

Другие решения

Вы можете сделать это с помощью SQL или PHP (вы можете проверить, какой из них быстрее).

Примечание: эти 2 решения дадут вам ранг, который начинается с 0.

SQL:

SELECT
`name`,
`likes`,
(SELECT COUNT(*) FROM `social` AS S2 WHERE S1.likes > S2.likes) AS `rank_2`
FROM `social` AS S1
WHERE `month` = '2015-01'
ORDER BY `likes` DESC

PHP:

$data = array();
$rank = 0;
$likes_pre = -1;
while ($table_row = mysqli_fetch_assoc($table)) {

$likes_cur = $table_row['likes'];

if ($likes_pre > $likes_cur) {
$rank++;
}

$data[$table_row['name']] = $table_row;
$data[$table_row['name']]['rank'] = $rank;

$likes_pre = $likes_cur;
}

Не проверено, но должно работать.

0

Попробуйте это … рейтинг должен быть одинаковым для всех строк с одинаковым количеством лайков

$data = array();
$rank = 0;
$last_likes =0;
while ($table_row = mysqli_fetch_assoc($table)) {
if ($last_likes != $row['likes']) {
$rank++;
}
$data[$table_row['name']] = $table_row;
$data[$table_row['name']]['rank'] = $rank;
}
0
По вопросам рекламы [email protected]