2012-07-02 2 views
1

Я пытаюсь создать запрос mysql, который оценивает бойцов MMA на основе их оценки, и независимо от того, являются ли они профессиональными и их весовым классом, вместе создавая подразделение бойцов. У меня есть таблица со всеми бойцами, которые содержат их вес, статус (профессиональный или любительский) и кучу других колонок. У меня также есть таблица, которая содержит оценки, которые рассчитываются из всех их боев. Записи должны быть заказаны как разделение и счет, но я могу получить только мой запрос по заказу подразделения:MySQL порядок, не работая с соединением

INSERT INTO fa_rankings (fighter_id, rank, division) 
SELECT 
    fa_scores.fighter_id, 
    @r := CASE WHEN @div <> f_division THEN 1 ELSE @r+1 END as f_rank, 
    @div := f_division 
FROM 
    (SELECT @div := NULL) d, 
    (SELECT @r := 0) r, 
    fa_scores 
JOIN (SELECT fa_fighters.fighter_id, 
     CONCAT(
      IF(status = 'professional', 'a', 'b'), 
      CASE 
       WHEN weight < 126 THEN 0 
       WHEN weight BETWEEN 126 AND 135 THEN 1 
       WHEN weight BETWEEN 136 AND 145 THEN 2 
       WHEN weight BETWEEN 146 AND 155 THEN 3 
       WHEN weight BETWEEN 156 AND 170 THEN 4 
       WHEN weight BETWEEN 171 AND 185 THEN 5 
       WHEN weight BETWEEN 186 AND 205 THEN 6 
       WHEN weight BETWEEN 206 AND 265 THEN 7 
       ELSE 8 END) as f_division 
    FROM fa_fighters 
    ORDER BY f_division ASC) as fighters using (fighter_id) 
ORDER BY score DESC 

Я предполагаю, что это что-то делать с тем, где последний заказ на утверждения, но я не могу понять, куда еще его поместить, потому что в объединенном запросе он не работает. Сейчас этот запрос генерирует следующее:

Rankings Table     Compared with Scores 
+------------+------+----------+ +-------+ 
| fighter_id | rank | division | | score | 
+------------+------+----------+ +-------+ 
| 131  | 1 | a1  | | 0  | 
| 23   | 2 | a1  | | 34 | 
| 332  | 3 | a1  | | 4  | 
| 1233  | 1 | a2  | | 0  | 
| 643  | 2 | a2  | | 44 | 
+------------+------+----------+ +-------+ 

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

EDIT: Вот результат моего выбора

SELECT * , 
(SELECT CONCAT_WS( ' ', f_name, l_name) FROM fa_fighters WHERE fa_fighters.fighter_id = fa_rankings.fighter_id) 
AS name, 
(SELECT score FROM fa_scores WHERE fa_scores.fighter_id = fa_rankings.fighter_id) 
AS score 
FROM `fa_rankings` 
WHERE 1 
ORDER BY division, rank ASC 
LIMIT 0 , 30 

select result

EDIT: Это упорядочение записей по счету, но не в той точке; он упорядочивает их по счету после определения ранга, так что исходная таблица упорядочивается по результату, но у бойцов нет правильного ранга, связанного с ними. Мне нужен запрос, чтобы заказать записи по счету, прежде чем он запустит счетчик ранга и определит рейтинг каждого бойца. Это проблема, когда ORDER BY выполняется при выполнении запроса, я просто не знаю, где его поставить.

+0

Удалить Сортировать по Внутреннему из дивизия запроса и поместить в внешнем запросе .. –

+0

я имел его в внешний запрос, но он не сработал, он не упорядочивался делением, EDIT, он дал бы всем бойцам рейтинг 1 или 2 –

ответ

1

Я понял, что перемещение «ORDER BY бальной DESC» в соединенном подзапрос производится правильный результат:

INSERT INTO fa_rankings (fighter_id, rank, division) 
SELECT 
    fa_scores.fighter_id, 
    @r := CASE WHEN @div <> f_division THEN 1 ELSE @r+1 END as f_rank, 
    @div := f_division 
FROM 
    (SELECT @div := NULL) d, 
    (SELECT @r := 0) r, 
    fa_scores 
JOIN (SELECT fa_fighters.fighter_id, 
     CONCAT(
      IF(status = 'professional', 'a', 'b'), 
      CASE 
       WHEN weight < 126 THEN 0 
       WHEN weight BETWEEN 126 AND 135 THEN '1' 
       WHEN weight BETWEEN 136 AND 145 THEN '2' 
       WHEN weight BETWEEN 146 AND 155 THEN '3' 
       WHEN weight BETWEEN 156 AND 170 THEN '4' 
       WHEN weight BETWEEN 171 AND 185 THEN '5' 
       WHEN weight BETWEEN 186 AND 205 THEN '6' 
       WHEN weight BETWEEN 206 AND 265 THEN '7' 
       ELSE '8' END) as f_division 
    FROM fa_fighters 
    ORDER BY 
     f_division ASC, 
     #the score column in the form of a subquery 
     (select score from fa_scores where fa_scores.fighter_id = fa_fighters.fighter_id) DESC) 
    as fighters using (fighter_id) 
0

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

Если вы не укажете order by, когда вы сделаете запрос, у таблицы не будет никакого заказа ВСЕ, даже с индексом у вас будет какой-то заказ, но это не 100% -ная точность в огромных таблицах.

Возобновление В вашем запросе у вас есть INSERT с порядком и соединениями, но это не значит, что при создании select..... вывод будет в том же порядке, что и вход. Мой совет всегда указывается ORDER BY и имеет УНИКАЛЬНЫЙ или ПЕРВЫЙ КЛЮЧ (по крайней мере один из них).

+0

. Следует отметить, что таблица внизу - это то, что я получил от выбранного запроса, который заказы по рангу (и выбирает счет) после того, как я это запустил; некоторые бойцы с самым высоким счетом в своем дивизионе занимают 15 или 20 баллов, а некоторые с 0 оцениваются 1. Также нет индекса по делению или счету –

+0

@GregRozmarynowycz Можете ли вы выполнить команду show show table tablename и показать ее?а также скопировать и вставить непосредственно запрос и результат – jcho360

+0

CREATE TABLE 'fa_rankings' ( ' fighter_id' varchar (12) NOT NULL, 'rank' int (6) NOT NULL, ' division' varchar (5) NOT NULL , KEY 'fighter_id' (' fighter_id') ) ENGINE = MyISAM DEFAULT CHARSET = utf8 –

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