2014-03-08 2 views
2

У меня проблема с запросом MySQL, и у меня есть ощущение, что для этого потребуются таблицы, но я не очень разбираюсь в запросах на соединение и задавался вопросом, кто-то может мне помочь?MySQL выбор топ-4 мужских баллов и топ-2 женских баллов из другой таблицы

У меня есть две таблицы. Первый из них называется «университеты» и выглядит следующим образом:

id | name 
1 | University One 
2 | University Two 

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

id | universityid | male | r1 | r2 | r3 | r4 

Где universityid 'является внешним ключом ссылаясь на первую таблицу, «мужчина» является логическим, определяющим пол участника, а r1 - r4 - это оценки из разных раундов соревнований.

Так эта таблица может выглядеть следующим образом:

id | universityid | male | r1 | r2 | r3 | r4 
------------------------------------------------- 
1 | 1   | 1 | 200 | 100 | 150 | 200 
2 | 1   | 1 | 50 | 100 | 150 | 200 
3 | 1   | 1 | 50 | 100 | 150 | 200 
4 | 1   | 1 | 50 | 100 | 150 | 200 
5 | 1   | 0 | 50 | 100 | 150 | 150 
6 | 1   | 0 | 50 | 100 | 150 | 150 
7 | 2   | 1 | 200 | 200 | 150 | 200 
8 | 2   | 1 | 200 | 100 | 150 | 200 
9 | 2   | 1 | 50 | 100 | 150 | 200 
10| 2   | 1 | 50 | 200 | 150 | 200 
11| 2   | 0 | 50 | 100 | 150 | 150 
12| 2   | 0 | 50 | 100 | 150 | 150 

То, что я пытаюсь сделать, это найти сумму 4 верхних мужских очков, а верхние 2 женских оценок для каждого раунда (r1 - r2) для каждого университета и вернуть общее количество за каждый раунд. Затем добавьте их вместе, чтобы составить общий балл по всем раундам для каждого университета, а затем упорядочить ряды университета в порядке DESC по этим суммам.

Так возвращение таблица может выглядеть следующим образом

university.name | r1total | r2total | r3total | r4total | totalscore 
--------------------------------------------------------------------- 
uni2name  | 600  | 800  | 900  | 1100 | 3400 

uni1name  | 450  | 600  | 900  | 1100 | 3050 

Любая помощь с этой проблемой будет высоко ценится.

+0

Лучшие 4 мужские баллы для каждого раунда? Показать некоторые выборочные данные или создать скрипку. – Mihai

+0

Я пробовал редактировать OP, чтобы сделать его немного яснее. –

+0

Сделал новый запрос. – Mihai

ответ

2
SELECT universityid,SUM(r1sum),SUM(r2sum),SUM(r3sum),SUM(r4sum), 
SUM(r1sum+r2sum+r3sum+r4sum)as TotalScore 
FROM 
(SELECT 
universityid, 
CAST(SUBSTRING_INDEX(
    GROUP_CONCAT(r1 ORDER BY r1 DESC), 
    ',', 1)as unsigned)+ 
CAST(SUBSTRING_INDEX(SUBSTRING_INDEX(CONCAT(
    GROUP_CONCAT(r1 ORDER BY r1 DESC),',0'), 
    ',', 2),',',-1)as unsigned)+ 
CAST(SUBSTRING_INDEX(SUBSTRING_INDEX(CONCAT(
    GROUP_CONCAT(r1 ORDER BY r1 DESC),',0'), 
    ',', 3),',',-1)as unsigned)+ 
CAST(SUBSTRING_INDEX(SUBSTRING_INDEX(CONCAT(
    GROUP_CONCAT(r1 ORDER BY r1 DESC),',0'), 
    ',', 4),',',-1)as unsigned)as r1sum, 
CAST(SUBSTRING_INDEX(
    GROUP_CONCAT(r2 ORDER BY r2 DESC), 
    ',', 1)as unsigned)+ 
CAST(SUBSTRING_INDEX(SUBSTRING_INDEX(CONCAT(
    GROUP_CONCAT(r2 ORDER BY r2 DESC),',0'), 
    ',', 2),',',-1)as unsigned)+ 
CAST(SUBSTRING_INDEX(SUBSTRING_INDEX(CONCAT(
    GROUP_CONCAT(r2 ORDER BY r2 DESC),',0'), 
    ',', 3),',',-1)as unsigned)+ 
CAST(SUBSTRING_INDEX(SUBSTRING_INDEX(CONCAT(
    GROUP_CONCAT(r2 ORDER BY r2 DESC),',0'), 
    ',', 4),',',-1)as unsigned)as r2sum, 
CAST(SUBSTRING_INDEX(
    GROUP_CONCAT(r3 ORDER BY r3 DESC), 
    ',', 1)as unsigned)+ 
CAST(SUBSTRING_INDEX(SUBSTRING_INDEX(CONCAT(
    GROUP_CONCAT(r3 ORDER BY r3 DESC),',0'), 
    ',', 2),',',-1)as unsigned)+ 
CAST(SUBSTRING_INDEX(SUBSTRING_INDEX(CONCAT(
    GROUP_CONCAT(r3 ORDER BY r3 DESC),',0'), 
    ',', 3),',',-1)as unsigned)+ 
CAST(SUBSTRING_INDEX(SUBSTRING_INDEX(CONCAT(
    GROUP_CONCAT(r3 ORDER BY r3 DESC),',0'), 
    ',', 4),',',-1)as unsigned)as r3sum, 
    CAST(SUBSTRING_INDEX(
    GROUP_CONCAT(r4 ORDER BY r4 DESC), 
    ',', 1)as unsigned)+ 
CAST(SUBSTRING_INDEX(SUBSTRING_INDEX(CONCAT(
    GROUP_CONCAT(r4 ORDER BY r4 DESC),',0'), 
    ',', 2),',',-1)as unsigned)+ 
CAST(SUBSTRING_INDEX(SUBSTRING_INDEX(CONCAT(
    GROUP_CONCAT(r4 ORDER BY r4 DESC),',0'), 
    ',', 3),',',-1)as unsigned)+ 
CAST(SUBSTRING_INDEX(SUBSTRING_INDEX(CONCAT(
    GROUP_CONCAT(r4 ORDER BY r4 DESC),',0'), 
    ',', 4),',',-1)as unsigned)as r4sum 


FROM 
competitors 
WHERE male=1 
GROUP BY 
universityid 
UNION ALL 
SELECT 
universityid, 
CAST(SUBSTRING_INDEX(
    GROUP_CONCAT(r1 ORDER BY r1 DESC), 
    ',', 1)as unsigned)+ 
CAST(SUBSTRING_INDEX(SUBSTRING_INDEX(CONCAT(
    GROUP_CONCAT(r1 ORDER BY r1 DESC),',0'), 
    ',', 2),',',-1)as unsigned)as r1sum, 
CAST(SUBSTRING_INDEX(
    GROUP_CONCAT(r2 ORDER BY r2 DESC), 
    ',', 1)as unsigned)+ 
CAST(SUBSTRING_INDEX(SUBSTRING_INDEX(CONCAT(
    GROUP_CONCAT(r2 ORDER BY r2 DESC),',0'), 
    ',', 2),',',-1)as unsigned)as r2sum, 
    CAST(SUBSTRING_INDEX(
    GROUP_CONCAT(r3 ORDER BY r3 DESC), 
    ',', 1)as unsigned)+ 
CAST(SUBSTRING_INDEX(SUBSTRING_INDEX(CONCAT(
    GROUP_CONCAT(r3 ORDER BY r3 DESC),',0'), 
    ',', 2),',',-1)as unsigned)as r3sum, 
    CAST(SUBSTRING_INDEX(
    GROUP_CONCAT(r4 ORDER BY r4 DESC), 
    ',', 1)as unsigned)+ 
CAST(SUBSTRING_INDEX(SUBSTRING_INDEX(CONCAT(
    GROUP_CONCAT(r4 ORDER BY r4 DESC),',0'), 
    ',', 2),',',-1)as unsigned)as r4sum 
FROM 
competitors 
WHERE male=0 
GROUP BY 
universityid)x 
GROUP BY universityid 
ORDER BY TotalScore DESC 

Fiddle

+0

Большое спасибо за вашу помощь! Это фантастика, кроме того, если какой-то университет не вошел в полную команду для раунда, то он пересчитывает баллы. Например, если у uni только один мужчина входит в конкретный раунд, он будет считать его счет 4 раза, когда он должен просто посчитать его один раз и оставить остальные оценки равными 0. Любые идеи? –

+0

Извините, я сделал еще одну ошибку в OP, которую исправил сейчас. Предполагалось вернуть имя университета, а не идентификатор uni. –

+0

@JamesMcIlveen Я буду над этим работать. – Mihai

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