2010-04-19 3 views
1

Эта проблема легко фиксируется клиентами. Но для производительности я хочу сделать это непосредственно в базе данных.Заказать гибридный смешанный результат поиска mysql в одном запросе?

LIST a 
+------+-------+-------+ 
| name | score | cre | 
+------+-------+-------+ 
| Abe | 3  | 1  | 
| Zoe | 5  | 2  | 
| Mye | 1  | 3  | 
| Joe | 3  | 4  | 

Хотите получить объединенный гибридный результат без дублирования.

Zoe (1st highest score) 
Joe (1st last submitted) 
Abe (2nd highest score) 
Mye (2nd last submitted) 
... 

Клиенты, я беру каждый поиск самостоятельно и шаг, хотя они. , но на 100.000+ его становится неловко. Чтобы использовать функцию LIMIT, это облегчило бы все!

SELECT name FROM a ORDER BY score DESC, cre DESC; 
SELECT name FROM a ORDER BY cre DESC, score DESC; 
+0

Здравствуйте, Фредрик, что вам нужно, вы бы это объяснили? – Karthik

ответ

1

MySQL не предоставляет аналитические функции, такие как ROW_NUMBER.

Один из способов осуществить это было бы два запроса с различными Order By, соединенных вместе:

Select s.name, s.score_num, c.cre_num 
From 
(
    Select name, @score_num := @score_num + 1 As score_num 
    From your_table, (SELECT @score_num := 0) v 
    Order By score Desc 
) s 
Join 
(
    Select name, @cre_num := @cre_num + 1 As cre_num 
    From your_table, (SELECT @cre_num := 0) v 
    Order By cre Desc 
) c 
On (c.name = s.name) 

возвращает

name score_num cre_num 
Joe   3  1 
Mye   4  2 
Zoe   1  3 
Abe   2  4 

Является ли это то, что вы хотите?

+0

Да, очень приятное решение! Присоединившись к данным, я могу выбрать, как оценить их важность. Оптимальным является мой случай на самом деле не строгая версия, а суммированная. Отлично сработано! "SELECT [...] IF (s.score_num Fredrik

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