Php 从mysql表中带有group by where date>date的表中选择
我需要的是,显示机器id和操作id的唯一组合的第一个完成日期,这将使用group by函数完成,同样,我想显示机器id和操作id的唯一组合的第一个选择完成日期之后的第一个完成日期 到目前为止,我所尝试的是如下所示 $query=SELECT* 从维护条目表 左连接 选择“在日期完成”作为“在日期完成”1,维护条目表* 来自维护\条目\表格$where 按机器id分组,操作id为groupedDate 维护时\u条目\u table.machine\u id=groupedDate.machine\u id 和维护\u条目\u table.operation\u id=groupedDate.operation\u id 和维护\u条目\u table.done\u on \u date>groupedDate.done\u on \u date1Php 从mysql表中带有group by where date>date的表中选择,php,jquery,html,mysql,Php,Jquery,Html,Mysql,我需要的是,显示机器id和操作id的唯一组合的第一个完成日期,这将使用group by函数完成,同样,我想显示机器id和操作id的唯一组合的第一个选择完成日期之后的第一个完成日期 到目前为止,我所尝试的是如下所示 $query=SELECT* 从维护条目表 左连接 选择“在日期完成”作为“在日期完成”1,维护条目表* 来自维护\条目\表格$where 按机器id分组,操作id为groupedDate 维护时\u条目\u table.machine\u id=groupedDate.machin
按机器标识、操作标识分组” 似乎您需要每辆车和每种服务类型的所有服务日期。由于没有包含表的架构, 我只是用你提到的专栏写了这篇文章。请随意添加任何缺少的列。我还创建了一个 这将生成表并运行下面的查询 日期不是单独的列,而是在一列中,用逗号分隔。显示时,可以轻松分解此列 价值观如果为每个日期创建单独的列,则必须知道最大日期数,并为每个日期构建一个包含联接的查询
SELECT
a.`car_name`,
a.`service_name`,
GROUP_CONCAT(a.`done_date` ORDER BY a.`done_date` ASC) as `Dates_Done`
FROM `maintenance_entry_table` a
LEFT JOIN (
SELECT
c.`car_name`,
c.`service_name`,
MIN(`done_date`) as `first_date`
FROM `maintenance_entry_table` c
GROUP BY c.`car_name`,c.`service_name`
) b
ON b.`first_date` < a.`done_date` AND b.`car_name` = a.`car_name` AND b.`service_name` = a.`service_name`
GROUP BY a.`car_name`,a.`service_name`
ORDER BY a.`car_name`,a.`service_name`;
编辑
这将生成您的示例输出,对于每辆车、服务和日期,它将输出车、服务、日期和下一个服务日期:
问题2:
:
:
选择*。。。group by machine\u id,操作\u id请求无效数据,因为您误用了MySQL的group by功能。。阅读@SumanDey如何为机器标识和操作标识的唯一组合构建一个查询以在日期完成,另一个查询以在日期完成。最后,cars的解释是不言自明的。我的意思是它实际上让人困惑,所以你试图让一个垂直的表相对于完成日期水平,还是每个服务都有两个不合理的完成日期?@MasonStedman,示例数据通常是不合理的。我明天一定会尝试,但我担心mindone_date总是以最短日期开始每一行,而required正好如car示例中所述,其中第一行first done_date和second done_date…………second done_date将成为第二行的first done_date,依此类推……对不起,我猜在左侧连接中不需要group by按照我对每辆车及其相关服务类型的要求选择语句。连接可防止您所说的关于同一辆车+服务的内容在每个日期重复作为第一个完成日期。除非那是你想要的。子查询中的group by是如何获得特定car+服务的最早完成日期。如果您真的希望显示为示例输出,那么使用此结果可以在PHP中轻松完成。请参阅我更新的答案。如果您想在date\u done顺序中显示结果,只需更改order BY子句,并将a.date\u done放在第一位。很抱歉打扰您,如果您能抽出一些时间,请查看下面我正在处理的查询。
| car_name | service_name | Dates_Done |
|-----------|----------------|----------------------------------|
| benz_1 | oil_change | 2017-01-14,2017-05-24 |
| porsche_1 | oil_change | 2017-01-04,2017-04-15,2017-07-12 |
| porsche_1 | replace_wipers | 2017-01-04 |
| porsche_1 | tire_check | 2017-01-04,2017-06-11 |
| porsche_2 | oil_change | 2017-05-01,2017-08-20 |
SELECT
a.`car_name`,
a.`service_name`,
a.`done_date`,
coalesce(MIN(b.`done_date`),'') as `next_done_date`
FROM `maintenance_entry_table` a
LEFT JOIN `maintenance_entry_table` b
ON b.`done_date` > a.`done_date` AND
b.`car_name` = a.`car_name` AND
b.`service_name` = a.`service_name`
GROUP BY a.`car_name`,a.`service_name`,a.`done_date`
ORDER BY a.`car_name`,a.`service_name`,a.`done_date`
| car_name | service_name | done_date | next_done_date |
|-----------|----------------|------------|----------------|
| benz_1 | oil_change | 2017-01-14 | 2017-05-24 |
| benz_1 | oil_change | 2017-05-24 | |
| porsche_1 | oil_change | 2017-01-04 | 2017-04-15 |
| porsche_1 | oil_change | 2017-04-15 | 2017-07-12 |
| porsche_1 | oil_change | 2017-07-12 | |
| porsche_1 | replace_wipers | 2017-01-04 | |
| porsche_1 | tire_check | 2017-01-04 | 2017-06-11 |
| porsche_1 | tire_check | 2017-06-11 | |
| porsche_2 | oil_change | 2017-05-01 | 2017-08-20 |
| porsche_2 | oil_change | 2017-08-20 | |
| id | car_name | service_name | done_date |
|----|-----------|----------------|------------|
| 1 | porsche_1 | oil_change | 2017-01-04 |
| 2 | porsche_1 | oil_change | 2017-04-15 |
| 3 | porsche_1 | oil_change | 2017-07-12 |
| 4 | benz_1 | oil_change | 2017-01-14 |
| 5 | benz_1 | oil_change | 2017-05-24 |
| 6 | porsche_1 | tire_check | 2017-01-04 |
| 7 | porsche_1 | tire_check | 2017-06-11 |
| 8 | porsche_1 | replace_wipers | 2017-01-04 |
| 9 | porsche_2 | oil_change | 2017-05-01 |
| 10 | porsche_2 | oil_change | 2017-08-20 |