在MySQL中将多行显示为一行

时间:2014-04-24 08:13:01

标签: php mysql

我需要一些建议

我创建了一个Web应用程序,用户可以将表单同时分配给多个收件人,以便一个作业将多行(每个收件人一行)插入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是一个数组,其中$row['id']引用了用户ID。

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

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

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

您已分配:表单1至:50位用户截止日期:2014年4月25日用户已完成:10查看用户列表

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

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

我不知道该如何解决这个问题。如果有人能指出我正确的方向,我将非常感激。

2 个答案:

答案 0 :(得分:1)

如果我确实理解你,你想向分配的人提交一份分配清单,按分配和日期分组。 对于每个作业/日期结果,您还需要显示已完成作业权限的用户数。

因此,您希望先从sender_idform_iddue_date选择分配和Group结果:

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

现在,您还希望通过JOIN作业来计算已完成此作业的学生人数。 这就是我添加别名'groupsAssignments'的原因。 因此,在JOIN

之后添加FROM
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 )

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

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

答案 1 :(得分:0)

您需要确定哪些行计为同一分配的一部分(这可能意味着将此信息添加到表中)。例如,如果您决定通过匹配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

这将给出用户完成的分配列表以及收件人的数量。当然,这可能需要调整或更改,具体取决于您决定如何匹配作业。