5

概述

我有一堆关于我正在举办的比赛的数据,我想以更好的格式展示它。

有4张桌子;前两个是不言自明的,pointsextras表本质上是完全相同的,它们只是存储在不同的表中,列名略有不同。

数据

    用户
    +----+----------------+------+
    | 编号 | 姓名 | 团队 |
    +----+----------------+------+
    | 1 | 约翰·多伊 | 1 |
    | 2 | 简巷 | 1 |
    | 3 | 杰克布莱克 | 4 |
    | 4 | 丹巴姆 | 3 |
    | 5 | 帕姆简 | 2 |
    | 6 | 流行馅饼 | 2 |
    | 7 | 约翰 Q | 1 |
    | 8 | 雨果奇怪 | 3 |
    | 9 | 吉米中子 | 2 |
    +----+----------------+------+
    团队
    +----+------------------+
    | 编号 | 姓名 |
    +----+------------------+
    | 1 | 团队乐趣 |
    | 2 | 梦之队 |
    | 3 | 在它赢得它|
    | 4 | 哥们 |
    +----+------------------+
    积分
    +---------+--------+------------+
    | 用户 ID | 积分 | 活动 |
    +---------+--------+------------+
    | 1 | 2 | 篮球 |
    | 2 | 4 | 篮球 |
    | 5 | 1 | 篮球 |
    | 8 | 3 | 篮球 |
    | 9 | 5 | 篮球 |
    | 2 | 8 | 排球 |
    | 5 | 5.5 | 排球 |
    | 6 | 6.5 | 排球 |
    | 7 | 2 | 排球 |
    | 8 | 4 | 排球 |
    | 9 | 9.5 | 排球 |
    | 1 | 2.5 | 躲避球 |
    | 3 | 3 | 躲避球 |
    | 4 | 4 | 躲避球 |
    | 6 | 9 | 躲避球 |
    | 7 | 2.5 | 躲避球 |
    | 9 | 3 | 躲避球 |
    +---------+--------+------------+
    附加功能
    +---------+--------+----------+
    | 用户 ID | 积分 | 描述 |
    +---------+--------+----------+
    | 1 | 5 | 伟大的体育精神 |
    | 3 | 10 | 团队球员 |
    | 8 | 5.5 | 最大改进 |
    +---------+--------+----------+

我想做的事

我想编写一个查询来返回特定团队参与的所有事件(和“额外”)、团队所有成员的总分以及该事件的参与成员。

下面的示例使用 Team Fun(团队 1):

+---------------------+--------+--------------------+------------+
|        event        | points |      members       | members_id |
+---------------------+--------+--------------------+------------+
| Basketball          |      6 | John Doe,Jane Lane | 1,2        |
| Volleyball          |     10 | Jane Lane,John Q   | 2,7        |
| Dodgeball           |      5 | John Doe,John Q    | 1,7        |
| Great Sportsmanship |      5 | John Doe           | 1          |
+---------------------+--------+--------------------+------------+

如果有人可以帮助我解决这个问题,我将不胜感激!

SQLFiddle

这是具有上述数据模式的 SQLFiddle - http://sqlfiddle.com/#!2/e8f97a

4

1 回答 1

1

您可以使用 aUNION将附加值和积分放在一起:

SELECT user_id, points, event
FROM points
UNION ALL
SELECT user_id, points, description AS event
FROM extras

然后使用它,您可以使用 aSUM和几个GROUP_CONCATs 编译您的信息:

SELECT P.event, SUM(P.points) AS points, 
    GROUP_CONCAT(U.name) AS members, GROUP_CONCAT(U.id) AS members_id
FROM teams T
INNER JOIN users U ON T.id = U.team
INNER JOIN
(
    SELECT user_id, points, event
    FROM points
    UNION ALL
    SELECT user_id, points, description AS event
    FROM extras
) P ON U.id = P.user_id
WHERE T.id = @teamId
GROUP BY P.event

SQL 小提琴示例

于 2013-10-03T16:17:16.637 回答