gpt4 book ai didi

mysql - MySQL如何有效地返回跨3个表相关的结果

转载 作者:行者123 更新时间:2023-11-28 23:39:54 24 4
gpt4 key购买 nike

你好,

我有以下 3 个表:order、manifest 和 tracking_updates。现在,每个订单都有一个名为 manifest_id 的外键,它引用 list 表。多个订单可以在一个 list 中。 tracking_updates 表有一个名为 order_id 的外键,它引用订单表。

现在, list 表包含一个名为 upload_date 的列。该列 upload_date 是我需要用来确定订单是否在过去 30 天内上传的列。

tracking_update 表可以包含每个订单的许多更新,因此,我必须返回符合以下条件的每个订单的最新跟踪更新状态:

1. orders < 30 days, any delivery status 
2. orders > 30 days, not delivered

请看下表

**Order**

ID | manifest_id

1 | 123

2 | 123

3 | 456

**Manifest**:

ID | upload_date

123 | 2015-12-15 09:31:12

456 | 2015-10-13 09:31:12

**Tracking Update**:

order_id | status_type | last_updated

1 | M | 2015-12-15 00:00:00

1 | I | 2015-12-16 07:20:00

1 | D | 2015-12-17 15:20:00

2 | M | 2015-12-15 00:00:00

2 | D | 2015-12-16 15:20:00

3 | M | 2015-10-13 00:00:00

3 | I | 2015-10-14 12:00:00

3 | E | 2015-10-15 13:50:00

这是上面订单的结果集的样子

**Result Set**

order_id | manifest_id | latest_tracking_update_status

1 | 123 | D

2 | 123 | D

3 | 456 | E

如您所见,订单 1、2 分配给 list 123, list 是在过去 30 天内上传的,其最新跟踪更新显示“D”表示已送达。所以这两个订单应该包含在结果集中。

订单 3 早于 30 天,但根据最新的 tracking_update status_type 尚未交付,因此它应该显示在结果集中。

现在,tracking_update 表以及所有订单的超过 100 万个更新。所以我真的要在这里提高效率

目前,我有以下疑问。

查询 #1 返回过去 30 天内上传的订单及其相应的最新跟踪更新

SELECT 
fgw247.order.id as order_id,
(SELECT
status_type
FROM
tracking_update as tu
WHERE
tu.order_id = order_id
ORDER BY
tu.ship_update_date DESC
LIMIT
1
) as latestTrackingUpdate
FROM
fgw247.order, manifest
WHERE
fgw247.order.manifest_id = manifest.id
AND
upload_date >= '2015-12-12 00:00:00'

查询 #2 返回 tracking_update 表中每个订单的 order_id 和最新跟踪更新:

SELECT tracking_update.order_id,
substring_index(group_concat(tracking_update.status_type order by tracking_update.last_updated), ',', -1)
FROM
tracking_update
WHERE
tracking_update.order_id is not NULL
GROUP BY tracking_update.order_id

我只是不确定如何组合这些查询来获得符合条件的订单:

  1. 订单 < 30 天,任何交货状态
  2. 订单 > 30 天,未交付

任何想法将不胜感激。

* 更新 *

由于选择了答案,这是当前查询:

select 
o.id, t.maxudate, tu.status_type, m.upload_date
from
(select order_id, max(last_updated) as maxudate from tracking_update group by order_id) t
inner join
tracking_update tu on t.order_id=tu.order_id and t.maxudate=tu.last_updated
right join
fgw247.order o on t.order_id=o.id
left join
manifest m on o.manifest_id=m.id
where
(tu.status_type != 'D' and tu.status_type != 'XD' and m.upload_date <='2015-12-12 00:00:00') or m.upload_date >= '2015-12-12 00:00:00'
LIMIT 10

更新

这是当前非常有效地连接三个表的查询

SELECT 
o.*, tu.*
FROM
fgw247.`order` o
JOIN
manifest m
ON
o.`manifest_id` = m.`id`

JOIN
`tracking_update` tu
ON
tu.`order_id` = o.`id` and tu.`ship_update_date` = (select max(last_updated) as last_updated from tracking_update where order_id = o.`id` group by order_id)
WHERE
m.`upload_date` >= '2015-12-14 11:50:12'
OR
(o.`delivery_date` IS NULL AND m.`upload_date` < '2015-12-14 11:50:12')
LIMIT 100

最佳答案

有一个子查询,从每个订单的跟踪表中返回最新更新日期。在跟踪、订单和 list 表上加入此子查询以获取详细信息并根据 where 子句中的上传日期进行过滤:

select o.order_id, t.maxudate, tu.status_type, m.upload_date
from (select order_id, max(update_date) as maxudate from tracking_update group by order_id) t
inner join tracking_update tu on t.order_id=tu.order_id and t.maxudate=tu.update_date
right join orders o on t.order_id=o.order_id
left join manifests m on o.manifest_id=m.manifest_id
where (tu.status_type<>'D' and curdate()-m.upload_date>30) or curdate()-m.upload_date<=30

在 where 子句中使用 union 查询而不是 or 条件可能更有效。

关于mysql - MySQL如何有效地返回跨3个表相关的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34698037/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com