第一个start_time和最后一个end_time,来自7个SQL行,仅显示1个SQL结果

时间:2013-01-14 21:22:41

标签: php mysql

我正在制作时间表提交/批准功能,目前正在处理pending.php页面,经理/管理员可以转到pending.php并查看待审时间表以供审核...

我现在的代码是:

list($qh,$num) = dbQuery(
"SELECT start_time, end_time, uid, submitid, submitstatus, submitdate, submitapprover 
FROM $TIMES_TABLE 
WHERE submitstatus=1 
ORDER BY submitid");

现在它显示了该周的所有时间表条目: example

我真正需要的是每周提交一行。基本上,抓住第一个start_time和最后一个end_time并将它们组合在一起(开始 - 结束) (start_time - end_time | username | id | submitdate | submit status..etc)

有人告诉我使用group_catcon或其他东西,但我不熟悉。

从我的照片中我想要的东西如下:

2012-12-30 - 2013-01-05 | admin | submitid#### | submitdate | status | approver
2013-01-06 - 2013-01-09 | admin | submitid#### | submitdate | status | approver

我对php / mysql很新,所以我很抱歉

2 个答案:

答案 0 :(得分:1)

您可能会发现,在所有这些列中,它会比您想要的更多。例如,有各种批准者。为此,您可能希望从查询中删除一些。

select 
  concat(min(start_time), ' - ', max(end_time)), 
  uid, 
  submitid, 
  submitstatus, 
  submitdate, 
  submitapprover
FROM 
  $TIMES_TABLE
WHERE 
  submitstatus=1 
GROUP BY
  uid, 
  submitid, 
  submitstatus, 
  submitdate, 
  submitapprover
ORDER BY 
  submitid

答案 1 :(得分:0)

我用多种语言构建了许多时间表应用程序。您可以使用group_concat将字符串与逗号绑定在一起,但我认为这不是您所需要的。

要抓住的是你必须和group by一起使用它。从您的数据库结构中,它可能不适合您。

“group by”规则是您必须选择在“group by”列列表中使用的列,或者您必须在该列上使用聚合函数。

在具有以下结构的书籍表上 books_sold(id,author_id,date,price) 你可以做以下的操作

select sum(price), author FROM books_sold group by author

获取每位作者的书籍总数。

select sum(price), date FROM books_sold group by date

获取每个日期出售的图书的总和。

select group_concat(id), date FROM books_sold group by date

获取每个日期出售的所有图书的ID。 id将以逗号分隔

但你不能做

select group_concat(id), date, author FROM books_sold group by date

因为在作者列中,您没有进行分组或群发操作。查询有效但作者列不可靠。

现在从您的数据库结构中,我认为您不能执行group_concat并仍然可以获得所需的字段。如果批准者在一周内不是同一个人,会发生什么?您的批准者专栏没有意义。如果提交者在一整周内不一样会怎么样?如果提交日期在一整周内不相同会怎样?

如果这些列始终相同,则可以执行

select CONCAT(min(start_time), ' - ', max(end_time)), uid, submitid, submitstatus, submitdate, submitapprover FROM $TIMES_TABLE WHERE submitstatus=1 GROUP BY uid, submitid, submitstatus, submitdate, submitapprover ORDER BY submitid