mysql - 如何按选定的顺序选择所有具有 min begin_date 和 max end_date 的工人?
问题描述
为了“测试”只有两个工人:
——亚当·盖克斯——安德鲁·沃姆
当我编写一个 select sql 查询时:
SELECT MIN(order_status.BEGIN_DATE), MAX(order_status.END_DATE) FROM order_status
INNER JOIN orders ON orders.ID_ORDER = order_status.ID_ORDER
WHERE orders.NUMBER_ORDER = 'TEST';
我知道 Min 的值是多少。BEGIN_DATE 和最大值。END_DATE 为“TEST”订单:
- MIN(order_status.BEGIN_DATE): 2019-03-18 06:45:11
- MAX(order_status.END_DATE): 2019-03-22 12:22:33
对于工人亚当盖克斯:
- MIN(order_status.BEGIN_DATE): 2019-03-18 06:50:35
- MAX(order_status.END_DATE): 2019-03-22 12:22:33
对于工人 Andrew Worm
- MIN(order_status.BEGIN_DATE): 2019-03-18 06:45:11
- MAX(order_status.END_DATE): 2019-03-22 11:23:45
我尝试了两种方式:
1) 带有FULL JOIN
- 表示LEFT JOIN
, UNION ALL
, RIGHT JOIN
:
SELECT MIN(order_status.BEGIN_DATE), MAX(order_status.END_DATE), workers.FNAME, workers.LNAME
FROM order_status
LEFT JOIN workers ON workers.ID_WORKER = order_status.ID_WORKER
INNER JOIN orders ON orders.ID_ORDER = order_status.ID_ORDER
WHERE orders.NUMBER_ORDER = 'TEST'
UNION ALL
SELECT MIN(order_status.BEGIN_DATE), MAX(order_status.END_DATE), workers.FNAME, workers.LNAME
FROM order_status
RIGHT JOIN workers ON workers.ID_WORKER = order_status.ID_WORKER
INNER JOIN orders ON orders.ID_ORDER = order_status.ID_ORDER
WHERE orders.NUMBER_ORDER = 'TEST';
然后我得到了结果,但它只显示了 1 个工人:
+----------------------------+--------------------------+--------+-------+
|MIN(order_status.BEGIN_DATE)|MAX(order_status.END_DATE)| FNAME | LNAME |
+----------------------------+--------------------------+--------+-------+
| 2019-03-18 06:45:11 | 2019-03-22 12:22:33 | Adam | Gax |
+----------------------------+--------------------------+----------+-----+
| 2019-03-18 06:45:11 | 2019-03-22 12:22:33 | Adam | Gax |
+----------------------------+--------------------------+----------+-----+
2) 我也在尝试FULL OUTER JOIN
- LEFT OUTER JOIN
, UNION ALL
, RIGHT OUTER JOIN
:
(SELECT MIN(order_status.BEGIN_DATE), MAX(order_status.END_DATE), workers.FNAME, workers.LNAME
FROM order_status
LEFT OUTER JOIN workers ON workers.ID_WORKER = order_status.ID_WORKER
INNER JOIN orders ON orders.ID_ORDER = order_status.ID_ORDER
WHERE orders.NUMBER_ORDER = 'TEST')
UNION ALL
(SELECT MIN(order_status.BEGIN_DATE), MAX(order_status.END_DATE), workers.FNAME, workers.LNAME
FROM order_status
RIGHT OUTER JOIN workers ON workers.ID_WORKER = order_status.ID_WORKER
INNER JOIN orders ON orders.ID_ORDER = order_status.ID_ORDER
WHERE zorders.NUMBER_ORDER = 'TEST');
但是与第一次尝试查询的效果相同。我会得到应该得到 min.BEGIN_DATE 和 max.END_DATE 的结果:
+----------------------------+--------------------------+--------+-------+
|MIN(order_status.BEGIN_DATE)|MAX(order_status.END_DATE)| FNAME | LNAME |
+----------------------------+--------------------------+--------+-------+
| 2019-03-18 06:50:35 | 2019-03-22 12:22:33 | Adam | Gax |
+----------------------------+--------------------------+--------+-------+
| 2019-03-18 06:45:11 | 2019-03-22 11:23:45 | Andrew | Worm |
+----------------------------+--------------------------+--------+-------+
可能需要更多的工人,但我想专注于这个案子。
现在我有一个问题:如何按选定的顺序选择所有具有 min begin_date 和 max end_date 的工人?提前谢谢。
解决方案
我会从表开始加入workers
。
然后你需要GROUP BY workers.FNAME, workers.LNAME
:
SELECT MIN(os.BEGIN_DATE), MAX(os.END_DATE), w.FNAME, w.LNAME
FROM workers w
INNER JOIN order_status os ON w.ID_WORKER = os.ID_WORKER
INNER JOIN orders o ON o.ID_ORDER = os.ID_ORDER
WHERE o.NUMBER_ORDER = 'TEST'
GROUP BY w.FNAME, w.LNAME
由于您使用表的WHERE
子句orders
,我认为不需要LEFT
连接。
我还为表格使用了别名,这是一种常见的良好做法。
推荐阅读
- macos - 如何避免无法通过代理建立隧道。代理在 MAC OS 中返回“HTTP/1.1 407 AuthorizedOnly”
- ios - Bundle.main.path(forResource:) 返回 nil
- java - MediaPlayer 在 seek() 调用之前不会播放
- android - Gradle api 与多模块项目中的实现的最佳实践
- bash - 我如何将 / 更改为 \/
- java - 无法使用spring和hibernate集成自动创建表和插入记录
- python - 尝试加载谷歌播放页面时,Selenium 无法找到“app-id-title”元素
- thingsboard - 超过 5000 个数据点
- javascript - 无法自动填充复选框并选择字段
- ffmpeg - 如何将图像和音频合并为具有相同颜色的视频?(FFMPEG)