2015-10-03 2 views
1

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

SELECT @s:[email protected]+1 serial_number, user_id, COUNT(slug_owner) as cnt 
FROM `votes_queue`,(SELECT @s:= 0) AS s 
GROUP BY slug_owner 
ORDER BY cnt DESC 

serial_number | user_id | cnt  
3 | 19 | 8 
2 | 14 | 4 
1 | 13 | 2 

По сути, мне нужно число в столбце SERIAL_NUMBER быть изменено так, что я могу сказать, что пользователь 13 # 3 на основе голосов ..

ответ

0

Назначает серийные номера после генерации заказанного количества:

SELECT @s:[email protected]+1 serial_number, temp.* 
FROM (
    SELECT user_id, COUNT(slug_owner) as cnt 
    FROM `votes_queue`, 
    GROUP BY slug_owner 
    ORDER BY cnt DESC 
) temp, (SELECT @s:= 0) AS s 
+0

Спасибо. Это было действительно полезно! – Ando

0

Серийные номера не меняются на противоположные, так как GROUP BY и переменные не смешиваются. ORDER BY в порядке. Вы можете использовать @ раствор hjpotter92, но следующий также исправляет проблему:

SELECT (@rn := @rn + 1) as serial_number, t.* 
FROM (SELECT serial_number, user_id, COUNT(slug_owner) as cnt 
     FROM `votes_queue` 
     GROUP BY slug_owner 
    ) t CROSS JOIN 
    (SELECT @rn := 0) params 
ORDER BY cnt DESC; 

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

+0

Я пошел с ответом @ hjpotter92. Спасибо, что поделились вторым решением. Надеюсь, это принесет пользу другим. – Ando

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