2014-01-05 2 views
0

У меня есть две таблицыPHP/MySQL Выбор список, основанный на 1 в X строк из второй таблицы

  • Игрок. поля: id, name
  • Событие. поля: event_id, player_id, rank

Это запрос списка очков/классификаторов, в котором меня просят предоставить список игроков, в которых 1 из 15 в событии квалифицируется. I.e. Если есть 15-29 человек, они будут иметь право на участие, 30-44 2 человека и т. Д. Основываясь на первом месте, занимающем первое место, 2 секунды и т. Д.

Я попросил предоставить список игроков, в которых они прошли квалификацию ,
Другое требование состоит в том, что Игрок должен был сыграть минимум 20 событий.

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

игрока Таблица

 
ID NAME 
1 player1 
2 player2 
3 player3 
4 player4 
5 player5 
6 player6 
7 player7 
8 player8 
9 player9 
10 player10 
11 player11 
12 player12 
13 player13 
14 player14 
15 player15 
16 player16 
17 player17 
18 player18 
19 player19 
20 player20 
21 player21 
22 player22 
23 player23 
24 player24 
25 player25 
26 player26 
27 player27 
28 player28 
29 player29 
30 player30 
31 player31 
32 player32 
33 player33 
34 player34 
35 player35 
36 player36 
37 player37 
38 player38 
39 player39 
40 player40 
41 player41 
42 player42 
43 player43 
44 player44 
45 player45 
46 player46 
47 player47 

Таблица событий

 
EVENTID PLAYERID RANK 
1 2 10 
1 10 9 
1 3 2 
1 1 15 
1 4 1 
1 5 16 
1 41 4 
1 30 3 
1 6 6 
1 11 7 
1 12 5 
1 13 8 
1 30 11 
1 29 14 
1 28 13 
1 7 12 
2 1 1 
2 2 31 
2 3 30 
2 4 29 
2 5 24 
2 6 3 
2 7 4 
2 8 5 
2 9 28 
2 10 27 
2 11 26 
2 12 6 
2 13 7 
2 14 8 
2 15 9 
2 16 10 
2 17 11 
2 18 12 
2 40 13 
2 41 14 
2 18 15 
2 20 16 
2 21 17 
2 22 18 
2 23 19 
2 24 20 
2 25 21 
2 26 22 
2 30 23 
2 31 2 
2 32 25 

Ожидаемый результат (без 20 игр фильтра)

 
player4 
player1 
player31 

Спасибо заранее.

+0

рассмотреть вопрос о предоставлении надлежащих DDLS и/или sqlfiddle ВМЕСТЕ с желаемыми РЕЗУЛЬТАТ ДЛЯ РЕЗУЛЬТАТОВ – Strawberry

+0

Что делать, если игрок попал в короткий список по рангу, но не сыграл минимум на 20 турнирах? Он просто должен быть удален из ресультированной или что-то еще? – peterm

+0

Я ожидал показать их в отдельном списке, отметив, что они квалифицировали, однако, еще не подходящие. Однако я думаю, что другой столбец (с использованием CASE?) Может просто помечать их как In-Available в том же списке? – user3163729

ответ

0

Вы можете сделать это таким образом (без второго требования)

SELECT p.name 
    FROM 
(
    SELECT eventid, COUNT(*) total 
    FROM event 
    GROUP BY eventid 
) t JOIN event e 
    ON t.eventid = e.eventid 
    AND e.rank <= FLOOR(t.total/15) JOIN player p 
    ON e.playerid = p.id 

Выход:

 
|  NAME | 
|----------| 
| player1 | 
| player4 | 
| player31 | 

Вот SQLFiddle демо


UPDATE вы можете встретить ваше второе требование таким образом

SELECT p.name, 
IF((
    SELECT COUNT(DISTINCT eventid) 
    FROM event 
    WHERE playerid = e.playerid 
) >= 20, 'Yes', 'No') eligible 
    FROM 
(
    SELECT eventid, COUNT(*) total 
    FROM event 
    GROUP BY eventid 
) t JOIN event e 
    ON t.eventid = e.eventid 
    AND e.rank <= FLOOR(t.total/15) JOIN player p 
    ON e.playerid = p.id 

Пример вывода:

 
|  NAME | ELIGIBLE | 
|----------|----------| 
| player1 |  No | 
| player4 |  No | 
| player31 |  No | 

Вот SQLFiddle демо

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