2015-03-17 2 views
2

я сделать простой SQL-запрос:реального ранга в MySQL и PHP

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

я добавить которым "Ранг" является intenger с ++

$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 | 
+------+------+-------+ +------+------+-------+ 

Как я могу получить правую сторону стола? есть способ решить его в запросе?

EDIT:

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

select IF(@likes=s.likes, @rownum, @rownum:[email protected]+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% правильно, потому что я хочу, чтобы пропустить ранг вместо подсчета через

+0

Предоставление истории с некоторыми примерами данных поможет, также используя запрос mysql, вы можете получить ранг напрямую. –

+0

@ Джеймс думает об этом скорее как о «месте», чем о «ранге», как о первом месте, втором месте и т. Д. Равные ранги должны означать «галстук» для ранга. –

+0

@DigitalChris Я полностью согласен с тобой, поэтому Джеймс думает о чем-то вроде табло. – CTSchmidt

ответ

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

Может быть, лучше сделать 'if ($ last_likes! = $ Row ['нравится']) '? В случае изменений заказа .... – cyadvert

+0

@cyadvert отлично, отредактировано и обновлено – dbinns66

0

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

$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; 
} 

Не тестировался, но должно сработать.

Смежные вопросы