【问题标题】:Display multiple rows as one in MySQL在 MySQL 中将多行显示为一行
【发布时间】:2014-04-24 08:13:00
【问题描述】:

我需要一些建议

我创建了一个网络应用程序,用户可以在其中同时将一个表单分配给多个收件人,以便一个分配将多行(每个收件人一行)插入到 form_assignments 表中,如下所示:

foreach ($recipients as $row) {
  $query = "INSERT INTO form_assignments 
       (sender_id, recipient_id, form_id, due_date, priority_id, comment, completed) 
       VALUES 
       ('{$sender_id}', " . $row['id'] . ", '{$assigned_form_id}', '2014-04-30 00:00:00', '{$priority_id}', '{$comment}', '{$completed}')";

在上面的示例中,$recipients 是一个数组,其用户 ID 由 $row['id'] 引用。

因此,例如,一项作业可以生成 100 行(针对 100 个收件人),并且每个收件人都可以将其单独的行编辑为“已完成”。到目前为止,这很好。

问题是,如果我想为分配它们的用户生成一个分配列表,我希望他只看到多用户分配的一行(而不是他发送分配给的每个收件人的一行)。

我希望能够向用户展示如下表格:

您将:表格 1 分配给:50 个用户 截止日期:2014 年 4 月 25 日 完成用户:10 查看用户列表

每个受让人都会看到如下表格:

用户 1 为您分配了以下表格:表格 1 截止日期:2014 年 4 月 25 日,点击标记为已完成

我不知道该怎么做。如果有人能指出我正确的方向,我将不胜感激。

【问题讨论】:

  • 您应该阅读 MySQL 文档或一些教程中的 JOINGROUP BY

标签: php mysql


【解决方案1】:

如果我对您的理解正确,您想向分配的人展示按任务和日期分组的任务列表。 对于每个分配/日期结果,您还希望显示有多少用户已经完成了分配权限。

所以你想从作业和Group 你的结果中选择sender_idform_iddue_date 首先:

SELECT sender_id, form_id, due_date
FROM assignments as groupedAssignments
GROUP BY 
  groupedAssignments.sender_id, 
  groupedAssignments.form_id, 
  groupedAssignments.due_date

现在您还想JOIN 作业,以计算有多少学生已经完成了这项作业。 这就是我添加别名“groupedAssignments”的原因。 所以在你的FROM之后添加一个JOIN

JOIN assignments as finishedAssignments ON (
  groupedAssignments.sender_id = finishedAssignments.sender_id
  AND groupedAssignments.form_id = finishedAssignments.form_id
  AND groupedAssignments.due_date = finishedAssignments.due_date
  AND finishedAssignments.completed = TRUE )

现在您可以在完成的作业上添加一个计数,为您提供完整的查询:

SELECT 
  groupedAssignments.sender_id, 
  groupedAssignments.form_id, 
  groupedAssignments.due_date, 
  COUNT(finishedAssignments.completed) as finishedStudents
FROM assignments as groupedAssignments
JOIN assignments as finishedAssignments ON (
  groupedAssignments.sender_id = finishedAssignments.sender_id 
  AND groupedAssignments.form_id = finishedAssignments.form_id
  AND groupedAssignments.due_date = finishedAssignments.due_date
  AND finishedAssignments.completed = TRUE )
GROUP BY 
  finishedAssignments.sender_id, 
  finishedAssignments.form_id, 
  finishedAssignments.due_date

显然我没有对此进行测试,它可能对您不起作用,但它应该会引导您朝着正确的方向前进。 阅读GROUP BYJOIN

【讨论】:

  • 是的,这听起来像我所追求的。我尝试了您的查询,但出现语法错误。我正在尝试一些更正,看看我能不能得到它。
  • @Mike 我进行了编辑,修复了我看到的语法错误(语句之间有 ,)。立即尝试,但请确保调整我的 pseudo-code 检查您的 completed 字段,因为您可能存储的不是布尔值,对吧?我认为它也不符合 SQL-2003。
  • 谢谢,安德烈施。我阅读了这篇文章,它很有帮助,也有点令人困惑。我将通过编辑再次尝试您的解决方案并让您知道。感谢您的时间和精力!
  • @Mike 考虑接受我的回答,这样这个问题就不会得到更多不必要的关注。
【解决方案2】:

您需要决定何时将行计为同一分配的一部分(这可能意味着将此信息添加到表中)。例如,如果您决定可以通过匹配 sender_id、form_id 和 due_date 来完成,那么您可以按以下字段进行分组:

SELECT sender_id,form_id,due_date,COUNT(recipient_id)
FROM assignments
GROUP BY sender_id,,form_id,due_date

这将给出用户完成的任务列表以及收件人的数量。当然,这可能需要根据您决定匹配作业的方式进行调整或更改。

【讨论】:

  • 谢谢,吉姆。我也会试试你的建议。
猜你喜欢
  • 1970-01-01
  • 2012-04-15
  • 2014-04-09
  • 2017-06-18
  • 1970-01-01
  • 1970-01-01
  • 2014-02-14
  • 2011-12-14
  • 1970-01-01
相关资源
最近更新 更多