2015-09-22 3 views
2

У меня есть рейтинговая комиссия за лучшие первые 100 блогов для каждого пола Malees and Females.Запрос MySQL, чтобы получить лучшие звания из одной таблицы и UPDATE с результатами другой

У меня есть блог таблица:

PRIMARY 
blogs_id users_id blogs_score blogs_score_time  gender 
    1   11  2852  2015-09-09 05:21:51  m <-- same score but older date 
    2   23  2146  2015-09-10 07:31:54  m 
    3   23  2146  2015-09-10 07:32:26  m 
    4   23  2852  2015-09-10 04:42:15  m <-- same score but newer date 
    5   51  1793  2015-09-11 08:15:55  f 
    6   88  2947  2015-09-11 09:33:18  f 

У меня есть пользователи таблица:

PRIMARY 
    id best_rank gender 
    11  0   m 
    23  0   m 
    51  0   f 
    88  0   f 

Мне нужно COUNT лучших рядов (с помощью MAX (blogs_score) и MAX (blogs_score_time)) для каждого user from Таблица дневников и INSERT/UPDATE Таблица пользователей с лучшими рангами для первых 100 пользователей каждого пола с самыми высокими рангами, поэтому результат должен быть:

PRIMARY 
    id best_rank gender 
    11  2   m 
    23  1   m 
    51  2   f 
    88  1   f 

Где пользователь id 11 имеет лучший ранг 2, потому что идентификатор пользователя 11 имеет тот же результат с пользователем 23, но старше даты, чем пользователь 23. Где пользователь 51 имеет рейтинг 2 из-за женской группы. Я добавил колонку blogs_score_time, чтобы предотвратить ранжирование рейтинга. И дата 2015-09-10 означает 10 сентября

Конечная идея состоит в том, чтобы показать положение ранг в профиле пользователя и один раз кто-то проголосовал (blogs_score изменения в таблице блогов), в best_rank столбец в таблице users должны обновляться с пересчетом новых рангов для ВСЕ 100 пользователей, которые имеют лучшие звания, в частности, гендерную группу.

Как адаптировать и исправить этот (нерабочий) запрос к моим потребностям?

$sql->query("UPDATE users 
      JOIN (SELECT b.users_id, 
         @curRank := @curRank + 1 AS rank, 
         MAX(blogs_score), MAX(blogs_score_time) 
        FROM blogs b 
         JOIN (SELECT @curRank := 0) r 
        ORDER BY b.blogs_score DESC, p.blogs_score_time DESC LIMIT 100 
       ) ranks ON (ranks.users_id = users.id) 
      SET users.best_rank = ranks.rank"); 

Или, как адаптировать и исправить это (не работает) запрос

$sql->query("INSERT INTO users (best_rank, id) 
        SELECT @rank := @rank + 1 AS rank, b.users_id 
         FROM blogs b 
         LEFT JOIN users u ON b.users_id = u.id 
        GROUP BY b.users_id, b.blogs_score, b.blogs_score_time, b.gender 
        ORDER BY b.blogs_score DESC, b.blogs_score_time DESC 
       ON DUPLICATE KEY UPDATE best_rank = VALUES(rank)"); 

Пожалуйста, помогите мне с запросом, чтобы решить эту проблему. Я не нашел подобного решения в stackoverflow, и мне кажется очень сложным написать такой запрос.

Большое спасибо!

ответ

1
UPDATE users u, (
SELECT 
( 
    CASE gender 
    WHEN @curType 
    THEN @curRow := @curRow + 1 
    ELSE @curRow := 1 AND @curType := gender END 
) + 1 AS rank, users_id, blogs_score, blogs_score_time, gender 
FROM blogs, 
(SELECT @curRow := 0, @curType := '') r 
ORDER BY gender, blogs_score DESC, blogs_score_time DESC 
) r1 
SET u.best_rank = r1.rank 
WHERE 
u.id = r1.users_id 

Это 2 работы:

  1. внутренний запрос на выборку генерирует разряд в соответствии с полом, оценка и время
  2. обновляет таблицу пользователей с соответствующим рангом.
+0

Идеальное решение !!! Спасибо огромное! – oxyd

0

Я думаю, вы должны добавить оговорку GROUP BY этот путь перед ORDER BY

$sql->query("UPDATE users 
       JOIN (SELECT b.users_id, 
         @curRank := @curRank + 1 AS rank, 
         MAX(b.blogs_score), MAX(b.blogs_score_time ) 
        FROM blogs b 
         JOIN (SELECT @curRank := 0) r 
        GROUP BY b.user_id, rank 
        ORDER BY b.blogs_score DESC, p.blogs_score_time DESC LIMIT 100 
       ) ranks ON (ranks.users_id = users.id) 
      SET users.best_rank = ranks.rank"); 
+0

Спасибо за ваш ответ, но этот запрос Я опубликовал как общую идею, как считать ранг и как примерно должен выглядеть запрос UPDATE. На самом деле этот запрос не работает, как есть. Я думаю, что MAX (b.blogs_score), MAX (b.blogs_score_time) не должно быть в SELECT при применении curRank к b.users_id. Я мог ошибаться, но надеюсь, что кто-то поможет. – oxyd

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