mysql - 在mysql中选择具有最大重复项的行以及不同的数据
问题描述
我有一个场景,我需要从一个表中获取最后 3 小时的数据,方法是将它与另一个表连接起来。请在下面找到 2 个表格
1.采购表
| PURCHASE_ID | ORDER_NO | PRODUCT_TYPE | PURCHASE_DATE | CREATE_DATE | MODIFIED_DATE |
|-------------|----------|--------------|---------------------|---------------------|---------------------|
| 500 | 612356 | FOOD | 2020-02-26 08:26:34 | 2020-02-26 08:26:34 | 2020-02-26 08:26:34 |
| 501 | 975432 | FOOD | 2020-02-26 08:29:12 | 2020-02-26 08:29:12 | 2020-02-26 08:29:12 |
| 502 | 156712 | ELECTRONICS | 2020-02-26 08:32:18 | 2020-02-26 08:32:18 | 2020-02-26 08:32:18 |
1.PURCHASE_DETAIL 表
| PURCHASE_DETAIL_ID | PURCHASE_ID | MESSAGE_STATUS | CREATE_DATE | MODIFIED_DATE |
|--------------------|-------------|----------------|---------------------|--------------------|
| 1011 | 500 | FAIL | 2020-02-26 08:27:14 | 2020-02-26 08:27:14|
| 1012 | 500 | SUCCESS | 2020-02-26 08:27:56 | 2020-02-26 08:27:56|
| 1013 | 501 | FAIL | 2020-02-26 08:29:14 | 2020-02-26 08:29:14|
| 1014 | 501 | SUCCESS | 2020-02-26 08:29:58 | 2020-02-26 08:29:58|
| 1015 | 501 | SUCCESS | 2020-02-26 08:30:02 | 2020-02-26 08:30:02|
| 1016 | 501 | FAIL | 2020-02-26 08:30:37 | 2020-02-26 08:30:37|
| 1017 | 501 | SUCCESS | 2020-02-26 08:31:22 | 2020-02-26 08:31:22|
| 1018 | 502 | FAIL | 2020-02-26 08:32:24 | 2020-02-26 08:32:24|
| 1019 | 502 | SUCCESS | 2020-02-26 08:32:49 | 2020-02-26 08:32:49|
| 1020 | 502 | FAIL | 2020-02-26 08:33:03 | 2020-02-26 08:33:03|
结果应该只有最新MESSAGE_STATUS
的失败并且表很大,我只需要最近3小时的数据。
结果我想要以下数据(我需要ORDER_NO
唯一的)
1.采购表
| PURCHASE_ID | ORDER_NO | PRODUCT_TYPE |
|-------------|----------|--------------|
| 502 | 156712 | ELECTRONICS |
我想出的最好的查询是
SELECT PURCHASE_ID, ORDER_NO, PRODUCT_TYPE FROM PURCHASE WHERE PURCHASE_ID IN (
SELECT A.PURCHASE_ID FROM PURCHASE A INNER JOIN
(SELECT PURCHASE_ID, MAX(PURCHASE_DETAIL_ID) AS NEW_ID, MESSAGE_STATUS
FROM PURCHASE_DETAIL WHERE CREATE_DATE > DATE_SUB(NOW(),INTERVAL 3 HOUR) GROUP BY PURCHASE_ID) B
ON A.PURCHASE_ID = B.PURCHASE_ID AND A.PURCHASE_DETAIL_ID = B.NEW_ID
AND A.MESSAGE_STATUS = "FAIL"
)
但这并没有给我预期的结果。任何人都可以看看,让我知道我错过了什么。我仍然是 SQL 的新手。
解决方案
您可以通过执行内部连接和 order by 子句来解决这个问题
SELECT PURCHASE_ID, ORDER_NO, PRODUCT_TYPE
FROM purchase p INNER JOIN purchase_detail pd ON p.purchase_id = pd.purchase_id WHERE
message_status='fail' AND pd.create_date BETWEEN date.now() AND date.now()-3 ORDER BY
pd.create_date DESC LIMIT 1
这将在三个小时的窗口内获取所有记录并获取 MESSAGE_STATUS 为失败的最新记录
推荐阅读
- r - 在R中使用缩放功能后如何获得中心和比例
- python - Python OpenCV 调整大小(插值)
- spring-boot - “状态”:500,“错误”:“内部服务器错误”,“异常”:“com.netflix.zuul.exception.ZuulException”,“消息”:“REJECTED_THREAD_EXECUTION”}
- c++ - 在同一地址上具有 2 个 std::atomic 变量的两个不同进程?
- python - 为什么 loc 和 iloc 在对 pandas DataFrame 的行进行切片时工作方式不同?
- git - 如何使用 CRLF 强制 git 提交?
- encoding - 我想知道是否有人可以向我解释 hashlib 中的 .decode 和 .encode ?
- java - Firebase admin SDK 使用 Java,无法解析
- sftp - 来自 Travis CI 构建的 SFTP 因主机密钥验证错误和连接重置错误而失败
- javascript - Jquery脚本键入脚本