PHP / MySQL从第二个表中选择基于X行中1个的列表

时间:2014-01-05 23:40:52

标签: php mysql sql

我有两张桌子

  • 播放器即可。字段:id,name
  • 事件即可。字段:event_id,player_id,rank

这是一个得分/限定符列表查询,我被要求提供一个玩家列表,其中15个中的1/15符合条件。 即如果有15-29人将有资格,30-44 2人等。基于等级1为第一名,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

提前致谢。

1 个答案:

答案 0 :(得分: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 演示


更新您可以通过这种方式满足第二个要求

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 演示