(MySQL,InnoDB)数据库有表Client (id, name)
和Order (id, client_id, name, order_date)
。我想查询他们接收Client
和 * 一个,最新的 * Order
为每个客户端的列表,或没有,如果没有为该客户端(左连接)。
在选定的行上还有其他约束、连接和列,但是它们不应该妨碍客户端顺序连接,因为客户端顺序连接是直接的。
问题是,即使有约束,它也要从总共100 000+行的选择中选择1000+行,并且需要15+分钟才能返回。当我尝试将其导出到CSV文件时,甚至在一个小时后它都无法完成。
以下是我的尝试:
SELECT DISTINCT Client.id as client_id,
Client.name as client_name,
Order.name as order FROM Client
LEFT JOIN Order on Order.id = (
SELECT O2.id FROM Order O2
<... joins and clauses for side tables ...>
WHERE O2.orderDate >= '2021-01-01' and O2.orderDate <= '2022-01-01'
AND O2.client_id = Client.id
ORDER BY O2.id DESC
LIMIT 1
)
<... joins and clauses for side tables ...>;
我在谷歌上搜索过,发现子查询效率很低,那么有没有一种方法可以在没有子查询的情况下和/或以一种更有效的方式查询呢?
编辑:我正在使用MySQL8和DBeaver 22.2.2。简单地查询数据并输出到DBeaver窗口需要大约11分钟。如果我然后右键单击它并选择"导出",问题就开始了。
2条答案
按热度按时间p4rjhz4m1#
我将使用CTE提取每个客户端的最新订单,然后查询该订单
zfciruhq2#
我将使用左连接来提取最大日期,然后获得该记录的ID,以便再次与订单连接。
瑞安|汉堡包|2023年3月9日00时00分
乔安娜|意大利面|2023年3月10日00时00分
斯比拉|奶酪2023年3月11日00:00:00
Jamal空空