2010-11-12 4 views
1

Я пытаюсь создать систему ранжирования в базе данных mysql.Группы и ряды строк в Mysql

Я нашел несколько руководств по ранжированию и пунктам здесь, в StackOverflow о ранжировании отдельных строк друг против друга.

Однако проблема заключается в том, что мне нужно группировать строки по столбцу идентификатора пользователя, добавлять значения ко второму столбцу, сгруппированному по идентификатору пользователя, а затем ранжировать их по отношению к другим группам другого идентификатора пользователя.

Вот пример таблицы я использую:

user_id km_skied date_entered 
1  34  2010-08-19 
3  2   2010-08-23 
1  3   2010-08-13 
4  23  2010-08-01 
3  5   2010-08-02 

Результат распечатке будет рангом:

Лыжник Ранг:

 
Rank User ID Total KM 
1  1  37 
2  4  23 
3  3  7 

Кроме того, мне было интересно, как Я нахожу ранг для конкретного пользователя. Смысл, если я знаю, что такое идентификатор пользователя, могу ли я дать им только их рейтинг? Как говорят

«Ваш ранг: 2 из 345»

Это является второй частью этого.

Кто-нибудь знает, как это сделать? Спасибо! Troy

ответ

0

Спасибо за помощь. я смог придумать ответ, основанный на следующем запросе:

$totalQuery = "SELECT SUM(track_length) as usertracklength, username, MAX(track_create_time) as lasttrack, count(DISTINCT track_create_time) as totaldays FROM user_tracks GROUP BY username ORDER BY usertracklength DESC"; 
$totalResult = mysql_query($totalQuery); 
$rankResult = mysql_query($totalQuery); 
$totalNumEntries = mysql_num_rows($totalResult); 

Тогда Ouputting, что массив

// rank position array 
$rankArray = array(); 

while ($row1 = mysql_fetch_array($rankResult)) { 
    $rankArray[] = $row1['username']; 
} 

Затем найти положение этого пользователя в массиве с помощью Еогеасп в php

foreach ($rankArray as $rank => $user) { 
    if ($user == $username) { 
    $yourRank = $rank+1; 
    } 
} 

Это длинный путь, но я полагаю, что это работает для того, что я собираюсь сделать. Был как бы надеяться сделать это в запросе mysql для повышения эффективности.

Спасибо!

0

Выполнение группировки в подзапросе и ранжировании результатов (с использованием любого из методов, которые вы нашли ранее) во внешнем запросе.

+0

Для этого требуется ЗАКАЗ BY в подзапросе, что не имеет смысла так как отношения должны быть множествами (неупорядоченными по определению). Но, к сожалению, я не знаю другого способа с MySQL. –

+0

Я нашел решение для первой части, ранжируя по группе, используя: "SELECT SUM(track_length) as usertracklength, username, MAX(track_create_time) as lasttrack, count(DISTINCT track_create_time) as totaldays FROM mv_user_tracks GROUP BY username ORDER BY usertracklength DESC";, затем используя PHP, чтобы распечатать результаты в упорядоченном списке. Мне нужно найти ранг для физических лиц, поэтому я могу распечатать что-то вроде «Ваш ранг: 2 из 100». – Troy

2

Ваш запрос должен выглядеть примерно так. Добавьте логику ранжирования во внешний цикл.

select * from 
    (select user_id, sum(km_skied) as km from ski group by user_id) x 
order by x.km desc; 

Не знаю, если это вариант, но вы можете использовать временную таблицу для рейтинга следующим образом:

create temporary table ranks (rank int primary key auto_increment, user_id int, km int); 

insert into ranks (user_id, km) 
    select user_id, km from (
     select user_id, sum(km_skied) as km from ski group by user_id 
    ) x order by x.km desc; 

Это дает вам то, что вы хотите:

mysql> select * from ranks; 
+------+---------+------+ 
| rank | user_id | km | 
+------+---------+------+ 
| 1 |  1 | 37 | 
| 2 |  4 | 23 | 
| 3 |  3 | 7 | 
+------+---------+------+ 
3 rows in set (0.00 sec) 

One Недостатком этого подхода является то, что лыжники, которые связаны, не получат одинаковый ранг.

0

Вы можете попробовать группировать, чтобы суммировать Km как первый запрос, а затем выполнить коррелированный подзапрос, чтобы найти ряды. Например, если ваши значения хранятся в таблице под названием «тест», суммируйте значения Km в таблицу, называемую testtbl, а затем выполните ранжирование.

mysql> выберите * из теста; + ------ + -------- + ------ + | Id | km_run | имя | + ------ + -------- + ------ + | 1 | 34 | a | | 3 | 2 | c | | 1 | 3 | a | | 4 | 23 | d | | 3 | 5 | c | + ------ + -------- + ------ + 5 строк в наборе (0,00 сек)

MySQL> создать таблицу testtbl, как (выбрать Id, сумма (км_рун) в качестве из теста группа по идентификатору);

запроса ОК, 3 ряда пострадавших (0,04 сек) записей: 3: 0 Дубликаты Предупреждения: 0

MySQL> выберите * от testtbl; + ------ + ------ + | Id | tot | + ------ + ------ + | 1 | 37 | | 3 | 7 | | 4 | 23 | + ------ + ------ + 3 строки в наборе (0,00 сек)

MySQL> выберите t1.Id, t1.tot, ((выберите отсчет (отличный t2.tot) из testtbl t2, где t1.tot < t2.tot) +1) как Rk из testtbl t1 заказать по Rk; + ------ + ------ + ------ + | Id | tot | Rk | + ------ + ------ + ------ + | 1 | 37 | 1 | | 4 | 23 | 2 | | 3 | 7 | 3 | + ------ + ------ + ------ + 3 ряда в наборе (0,00 сек)

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