Я делаю простой 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% правильный, потому что я хочу пропустить рейтинг вместо того, чтобы считать через
Я вижу, что здесь происходит.
Я не знаю о лучших практиках, но я бы, наверное, сделал что-то подобное сам:
$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++;
}
Я не проверял это, но вы можете попробовать и посмотреть.
Вы можете сделать это с помощью 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;
}
Не проверено, но должно работать.
Попробуйте это … рейтинг должен быть одинаковым для всех строк с одинаковым количеством лайков
$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;
}