【问题标题】:MySQL select a list of users from a table grouped by projects, listed in descending amount of hoursMySQL 从按项目分组的表中选择用户列表,按小时数降序排列
【发布时间】:2015-05-15 13:18:26
【问题描述】:

我有一个这样的时间表:

CREATE TABLE time
    (`id` int, `hours` float(1), `project` varchar(55), `user` varchar(45));

INSERT INTO time
    (`id`, `hours`, `project`, `user`)
VALUES
    (1, '3.5', 'Project A', 'Bob'),
    (2, '1', 'Project A', 'Anne'),
    (3, '2', 'Project B', 'Anne'),
    (4, '6', 'Project B', 'Anne'),
    (5, '2', 'Project C', 'Joe'),
    (6, '9', 'Project C', 'Joe'),
    (7, '1', 'Project C', 'Sam'),
    (8, '22', 'Project A', 'Bob');

我想返回一个这样的表:

th {background-color:#999999}
td {width:200px}
<table>
<thead>
  <tr>
    <th>Project</th>
    <th>User 1 (most hours)</th>
    <th>User 2 (2nd most hours)</th>
    <th>etc....</th>
  </tr>
</thead>

<tr>
  <td>Project A</td>
  <td>Bob</td>
  <td>Anne</td>
</tr>

<tr>
  <td>Project B</td>
  <td>Anne</td>
  <td>null</td>
</tr>

<tr>
  <td>Project C</td>
  <td>Joe</td>
  <td>Sam</td>
</tr>
</table>

如图所示,我需要按降序列出谁在每个项目上花费的时间最多。我相信我需要从子查询中执行 SELECT,但我似乎无法让它正常工作。

【问题讨论】:

    标签: php mysql select max


    【解决方案1】:

    试试这个查询:

    SELECT project, user
    FROM time
    GROUP BY project, user
    ORDER BY SUM(hours) DESC
    

    这将根据您问题中的示例数据给出以下结果集:

    --------------------
    |  project  | user |
    --------------------
    | Project A | Bob  |
    | Project A | Anne |
    | Project B | Anne |
    | Project C | Joe  |
    | Project C | Sam  |
    --------------------
    

    请注意,没有列出每个用户在每个项目上的总工作时间,因为您没有要求。

    【讨论】:

    • 谢谢,这非常接近我的需要。有没有办法每行只显示一个项目并在列中添加其他用户?甚至将每个结果限制为仅显示每个项目的 MAX 用户。
    猜你喜欢
    • 1970-01-01
    • 2011-08-01
    • 1970-01-01
    • 2015-07-17
    • 2019-05-31
    • 2012-10-18
    • 1970-01-01
    • 2012-04-25
    相关资源
    最近更新 更多