Php 在子查询或逃避子查询中选择多行

Php 在子查询或逃避子查询中选择多行,php,mysql,sql,Php,Mysql,Sql,我想知道如何实现查询,从同一个表中选择按clientid列分组的时间和列,其中子句除以月份和部门: 表如下: 1 06:20:00 11:00:00 2 06:20:00 11:00:00 这里的目标是获得如下最终结果: 1 06:20:00 11:00:00 2 06:20:00

我想知道如何实现查询,从同一个表中选择按clientid列分组的时间和列,其中子句除以月份和部门:

表如下:

1   06:20:00    11:00:00                                            
2   06:20:00    11:00:00

这里的目标是获得如下最终结果:

1   06:20:00    11:00:00                                            
2   06:20:00    11:00:00
结果1.0

------------------------------
clientid | december| february
------------------------------
1        | 2:20    | 4:00
------------------------------
2        | 4:00    | 7:00
------------------------------ 
结果将以以下方式显示:

<table>
  <thead>
    <tr>
      <th>Clientes</th>
      <th>January</th>
      <th>February</th>                                                         
    </tr>
</thead>
<tbody>
<?php foreach($stmt as $row)
{   
echo"
<tr>
  <td>".$row['clientid']."</td>
  <td>".$row['january']."</td>
  <td>".$row['february']."</td>                               
</tr>"; }; ?>              
</tbody>
</table>  
我得到错误:SQLSTATE[21000]:基数冲突:1242子查询返回超过1行

因为子查询返回多行

如果子查询中没有GROUP BY,则结果如下:

1   06:20:00    11:00:00                                            
2   06:20:00    11:00:00
因此,我的问题是如何构造查询以获得结果1.0中显示的所需结果

------------------------------
clientid | december| february
------------------------------
1        | 2:20    | 4:00
------------------------------
2        | 4:00    | 7:00
------------------------------ 

欢迎任何帮助。谢谢大家!

不需要使用子查询。您可以使用条件聚合:

选择SUM(如果月份(`date`)=2,则选择TIME到秒(`TIME`),否则选择0结束)作为二月,
总和(如果月份(`date`)=12,则时间为秒(`TIME`),否则为0结束)为12月
从时间管理
其中t.department=“$department”
按客户分组

通过这种方式,您可以计算一年中每个月的时间总和。

无需使用子查询。您可以使用条件聚合:

选择SUM(如果月份(`date`)=2,则选择TIME到秒(`TIME`),否则选择0结束)作为二月,
总和(如果月份(`date`)=12,则时间为秒(`TIME`),否则为0结束)为12月
从时间管理
其中t.department=“$department”
按客户分组
通过这种方法,您可以计算一年中每个月的时间总和。

尝试使用以下方法:

SELECT SUM( CASE WHEN MONTH(`date`) = 2 THEN TIME_TO_SEC( `time` )  ELSE 0 END) AS February,
       SUM( CASE WHEN MONTH(`date`) = 12 THEN TIME_TO_SEC( `time` )  ELSE 0 END) AS December
FROM time_management
WHERE t.department = '$department'
GROUP BY clientid
尝试使用以下方法:

SELECT SUM( CASE WHEN MONTH(`date`) = 2 THEN TIME_TO_SEC( `time` )  ELSE 0 END) AS February,
       SUM( CASE WHEN MONTH(`date`) = 12 THEN TIME_TO_SEC( `time` )  ELSE 0 END) AS December
FROM time_management
WHERE t.department = '$department'
GROUP BY clientid

您在第一个查询中是否有输入错误?2而不是12?或者这是故意的?想法是同时选择2个月。二月和十二月。该案例是否只选择两个月中的一个月?@davejal
2
用于
2月
,而
12
用于
12月
。我之所以将这些月包括在内,是因为OP@JohnSiniger每个
案例
计算一个月的
总和
。您可以包含
12
单独的
案例
,以计算每个月的
总和。@johnsinger使用
秒到秒时间
您在第一次查询中有输入错误吗?2而不是12?或者这是故意的?想法是同时选择2个月。二月和十二月。该案例是否只选择两个月中的一个月?@davejal
2
用于
2月
,而
12
用于
12月
。我之所以将这些月包括在内,是因为OP@JohnSiniger每个
案例
计算一个月的
总和
。您可以包含
12
单独的
案例
,以便计算每个月的
总和。@johnsinger使用
秒到秒时间
当您有多年的时间时,您希望如何处理?所有12月都设置为1月,所有2月都设置为2月,甚至跨越数年?可能重复您尝试执行的操作称为“透视表”。不幸的是,MySQL似乎没有内置支持(与其他一些DBs不同),链接的问题中有一些关于如何解决缺少PIVOT的问题的信息。当您有多年的工作经验时,您希望如何处理?所有12月都设置为1月,所有2月都设置为2月,甚至跨越数年?可能重复您尝试执行的操作称为“透视表”。不幸的是,MySQL似乎没有对此的内置支持(与其他一些DBs不同),链接的问题有一些关于如何解决缺少PIVOT的问题的信息。