MySQL,从两个不同的列中获取具有最新日期的表中的行

MySQL,从两个不同的列中获取具有最新日期的表中的行,mysql,sql,Mysql,Sql,我有一个mysql数据库,每天早上从oracle数据库导入数据。该表约有3000万条记录。这大约需要5-6个小时。 晚上,我复制表格,这样我就可以从一个显示表格内容的网格的网站上访问它 这张桌子看起来像这样 id userID fieldID date1 date2 1 1 1 2014 2014 2 1 1 2014 2016 3 1

我有一个mysql数据库,每天早上从oracle数据库导入数据。该表约有3000万条记录。这大约需要5-6个小时。 晚上,我复制表格,这样我就可以从一个显示表格内容的网格的网站上访问它

这张桌子看起来像这样

id     userID     fieldID    date1    date2
1         1           1       2014     2014
2         1           1       2014     2016
3         1           1       2013     2017
4         1           2       2014     2016
5         2           3       2014     2016
基本上在网站上,用户输入userID,我必须显示每个fieldID的记录,这些fieldID有最新的date1,然后是最新的date2 因此,userID=1的输出应该是:

id     userID     fieldID    date1    date2
2         1           1       2014     2016
4         1           2       2014     2016
到目前为止,我使用的查询是:

SELECT id,UserID,fieldID,date1,date2 FROM mytable WHERE id = 
( SELECT id from mytable AS lookup 
  WHERE lookup.fieldID = mytable.fieldID
  ORDER BY date1 DESC, date2 DESC
  LIMIT 1 ) AND UserID=1
这是可行的,但查询服务器和加载页面需要的时间太长,而如果我为一个特定的userID选择了所有内容,只需一秒钟就可以获取大约2000行

我想知道你是否可以建议一个更好的查询或者一个解决方法,在这里我不用复制表,而是用我需要的记录创建一个新的表(该网站晚上不使用)


谢谢

像这样的东西怎么样:

SELECT  id, mytable.UserID, mytable.fieldID, A.date1, B.date2
FROM    mytable AS outer,
(
    SELECT      MAX(date1) AS date1
    FROM        mytable AS innerone
    WHERE       innerone.id=outer.id
    WHERE       innerone.UserID=outer.UserID
    AND         innerone.fieldID=outer.fieldID
    GROUP BY    innerone.id,
                innerone.UserID,
                innerone.fieldID
)       AS A,
(
    SELECT      MAX(date2) AS date2
    FROM        mytable AS innertwo
    WHERE       innertwo.id=outer.id
    WHERE       innertwo.UserID=outer.UserID
    AND         innertwo.fieldID=outer.fieldID
    GROUP BY    innertwo.id,
                innertwo.UserID,
                innertwo.fieldID
)       AS B
WHERE UserID=1

您应该尝试在date1和date2上添加和索引,但是USERIDI认为SQL有一些问题。为什么内部查询中不使用UserID?这似乎令人怀疑。检查一下。然后确保你有一个关于UserID,fieldID,date1,date2的索引这是一个非常奇怪的请求。
SELECT  id, mytable.UserID, mytable.fieldID, A.date1, B.date2
FROM    mytable AS outer,
(
    SELECT      MAX(date1) AS date1
    FROM        mytable AS innerone
    WHERE       innerone.id=outer.id
    WHERE       innerone.UserID=outer.UserID
    AND         innerone.fieldID=outer.fieldID
    GROUP BY    innerone.id,
                innerone.UserID,
                innerone.fieldID
)       AS A,
(
    SELECT      MAX(date2) AS date2
    FROM        mytable AS innertwo
    WHERE       innertwo.id=outer.id
    WHERE       innertwo.UserID=outer.UserID
    AND         innertwo.fieldID=outer.fieldID
    GROUP BY    innertwo.id,
                innertwo.UserID,
                innertwo.fieldID
)       AS B
WHERE UserID=1