【发布时间】:2014-12-04 02:19:30
【问题描述】:
我们的服务器很难运行此查询。我希望有人可以通过建议一种重写方法来帮助我,以便在没有子查询的情况下获得相同的结果。
子查询的目的是在 where 子句中使用 min:我只想返回带有最早的 co.created 日期的结果。
所以我希望我能做的是:
SELECT
my.data AS Account_ID,
co.ID AS User_ID,
def.def_medium,
co.created
FROM (tables with associated joins)
WHERE MIN(co.created)
但我不能这样做,所以我想出了这个:
SELECT
my.data AS Account_ID,
co.ID AS User_ID,
def.def_medium,
co.created
FROM
abc_emails.cid208 co
INNER JOIN abc_emails.def208 def ON def.eid = co.id
INNER JOIN abc_emails.my208 my ON my.eid = co.id AND my.my_id = 2765
INNER JOIN (SELECT
my.data AS Account_ID,
MIN(created) AS created
FROM
abc_emails.my208 my
INNER JOIN abc_emails.cid208 co ON co.id = my.eid
WHERE my_id = 2765
GROUP BY Account_ID
) b1 ON b1.Account_ID = my.data
GROUP BY Account_ID, User_ID, def_medium
但它已经运行了很长时间,并且根据我在这台服务器上的经验,我即将被启动并显示一条错误消息,告诉我它已超时。
是否可以在没有子查询的情况下做我正在做的事情?
【问题讨论】:
-
?但这并不是真正的查询
-
@Strawberry 怎么样?您是指顶部的“查询”吗?那是我只是想写得更少,更直截了当。我的目标是重写大查询减去必须使用 b1
-
除非 MySQL 中有 OLAP 函数(RANK 等),否则需要显式的子查询。使用 OLAP 函数,您可能会做得更流畅。
-
其他人可能会有不同的感觉,但如果我看不到实际的查询(以及更多),那么在大多数情况下我无能为力。因此,如果您愿意,请考虑遵循这个简单的两步操作: 1. 如果您还没有这样做,请提供适当的 DDL(和/或 sqlfiddle),以便我们可以更轻松地复制问题。 2. 如果您尚未这样做,请提供与步骤 1 中提供的信息相对应的所需结果集。
标签: mysql