简体   繁体   English

在MySQL中将多行显示为一行

[英]Display multiple rows as one in MySQL

I need some advice on 我需要一些建议

I created a web app where a user can assign a form to multiple recipients simultaneously so that one assignment inserts multiple rows (one row per recipient) into the form_assignments table like so: 我创建了一个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}')";

In the example above, $recipients is an array with user ids referenced by $row['id'] . 在上面的示例中, $recipients是一个数组,其中的用户ID由$row['id']引用。

So, one assignment can generate 100 of these rows (for 100 recipients), for example, and each recipient can edit his individual row as "completed". 因此,例如,一个作业可以生成100个这样的行(对于100个收件人),每个收件人可以将其单独的行编辑为“已完成”。 This is good so far. 到目前为止,这很好。

The problem is, if I want to generate a list of assignments for the user that assigned them I want him to see only one row for a multiple-user assignment (not one row for each recipient he sent the assignment to). 问题是,如果我想为分配用户的用户生成分配列表,我希望他只看到多用户分配的一行(而不是向他发送分配给的每个收件人的一行)。

I'd love to be able to show the user a table like: 我希望能够向用户显示如下表格:

You assigned: form 1 To: 50 users Due on: April 25, 2014 Users Completed: 10 View List of Users 您分配了:表格1收件人:50个用户截止日期:2014年4月25日用户完成:10查看用户列表

And each assignee would see a table like: 每个受让人都会看到一个表格,如下所示:

User 1 assigned you the following form: form 1 Due on: April 25, 2014, Click to Mark as Completed 用户1为您分配了以下表单:表单1到期日:2014年4月25日,单击以标记为已完成

I'm not sure how to go about this. 我不确定该怎么做。 If anyone could point me in the right direction I would greatly appreciate it. 如果有人能指出正确的方向,我将不胜感激。

If i do understand you correctly, you want to present to the person that assigns, a list of assignments, grouped by assignment and date. 如果我确实正确理解您的意思,那么您想向作业人员出示一份作业清单,按作业和日期分组。 For each Assignment/Date Result, you alos want to present how many Users already completed the Assignment right. 对于每个分配/日期结果,您都希望显示有多少用户已完成分配权限。

So you want to Select from assignments and Group your Result by sender_id , form_id and due_date first: 所以,你想从分配和选择集团通过你的结果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

Now you also want to JOIN the assignments to get th count for how many students already finished this assignment. 现在,您还想JOIN作业,以计算已经完成此作业的学生人数。 That's why i added the alias 'groupedAssignments'. 这就是为什么我添加别名“ groupedAssignments”的原因。 So add a JOIN After your FROM 因此,在FROM JOIN添加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 )

Now you can add a Count on the finished assignments giving you the full Query: 现在,您可以在完成的作业上添加一个计数,从而获得完整的查询:

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

Obviously i didn't test this and it might not work for you, but it should lead you in the right direction. 显然,我没有对此进行测试,它可能对您不起作用,但它应该引导您朝着正确的方向发展。 Read up on GROUP BY and JOIN . 阅读GROUP BYJOIN

You need to decide when rows count as being part of the same assignment (this may mean adding this info to the table). 您需要确定何时将行计为同一分配的一部分(这可能意味着将此信息添加到表中)。 If, for example, you decide that this can be done by matching the sender_id, form_id and due_date then you can group by these fields: 例如,如果您确定可以通过匹配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

That will give a list of assignments done by the user as well as the count of recipients. 这将给出用户完成的任务列表以及接收者的数量。 Of course this may need tweaked or changed depending on how you decide to match assignments. 当然,这可能需要调整或更改,具体取决于您决定如何匹配分配。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM