我们的服务器很难运行此查询。我希望有人能够通过建议一种重写方式来获得相同的结果而不用子查询来帮助我。WHERE fieldname IS MIN(somedate)有没有办法在不使用子查询的情况下编写它?
子查询的目的是在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 2014-12-01 23:04:54
@Strawberry是怎么回事?你是指顶部的“查询”?这就是我只想写得更少,并且更加直截了当。我的目标是重写大查询减去必须使用b1 – 2014-12-01 23:06:47
除非MySQL中有OLAP函数(RANK等),否则显式的子查询是必要的。使用OLAP功能,您可能会更光滑地做到这一点。 – 2014-12-01 23:10:22