从mysql表中带有group by where date>date的表中选择

xytpbqjk  于 2021-06-21  发布在  Mysql
关注(0)|答案(1)|浏览(298)

我需要的是,显示第一个完成日期的机器id和操作id的唯一组合,这将使用功能组完成,我想再次显示完成日期的机器id和操作id的唯一组合后,必须在第一个选定的完成日期。
到目前为止,我所尝试的是如下所示。

$query = "SELECT * 
    FROM maintenance_entry_table 
    LEFT JOIN (
        SELECT (done_on_date) AS done_on_date1, maintenance_entry_table.*
        FROM maintenance_entry_table $where 
        GROUP BY machine_id,operation_id) as groupedDate 
    ON maintenance_entry_table.machine_id = groupedDate.machine_id
        AND maintenance_entry_table.operation_id = groupedDate.operation_id 
        AND maintenance_entry_table.done_on_date > groupedDate.done_on_date1 
    group by machine_id, operation_id”;

$where被明确定义为where子句。
但似乎不起作用。由于机器id和操作id的独特组合,它在日期上显示相同的完成日期,而不是之后的完成日期。我完全不知道。
下面给出了它在html页面上的进一步显示方式。

echo "<tr>";
echo "<td>" . $row['machine_id'] ."</td>"; 
echo "<td>" . $row['operation_id'] ."</td>"; 
echo "<td>" . $row['done_on_date'] ."</td>"; 
echo "<td>" . $row['done_on_date1'] ."</td>"; //this brings up same date as 'done_on_date' whereas it should be the next date coming in row for the unique combination of machine_id and operation_id
echo "</tr>";

如果我进一步解释的话,比如说,你有两辆保时捷汽车,分别是保时捷1系和保时捷2系。现在,保时捷1型车在一年内被送去维修4次。现在让我们假设执行的服务类型是相同的,称为服务1。因此,保时捷1的首次保养时间是2017年4月1日。保时捷第二次保养时间为2017年4月15日。保时捷1的第三次保养是2017年4月18日,保时捷1的第四次保养是2017年4月20日。我想把这些细节放在下面一行,

car_name    service_name    done_date     done_date  
porsche_1     service_1,     01/04/2017    15/04/2017
porsche_1     service_1      15/04/2017    18/04/2017
porsche_1     service_1      18/04/2017    20/04/2018
porsche_1     service_1      20/04/2017   blank  //bcoz service not yet executed

其他车也一样。
希望这已经足够清楚了。

6rqinv9w

6rqinv9w1#

似乎您需要每辆车和每种服务类型的所有服务日期。因为您没有包含表的模式,所以我只使用了您提到的列来编写本文。请随意添加任何缺少的列。我还创建了一个sqlfiddle来构建表并运行下面的查询。
日期不是单独的列,而是用逗号分隔的一列。在显示值时,可以很容易地分解此列。如果为每个日期创建单独的列,则必须知道最大日期数,并为每个日期构建一个带有联接的查询。

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`;

结果:

|  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            |

编辑
这将产生您的示例输出,对于每辆车、服务和日期,它将输出车、服务、日期和下一个服务日期:
sqlfiddle公司
问题2:

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 |

相关问题