1

在此处查看我的表和查询(在 sqlfiddle 上)

Myquery 正在获取我需要的确切结果,但是当数据超过 1000 行时需要很长时间。我需要让它高效

Select `id`, `uid`, case when left_leg > right_leg then left_leg
else right_leg end as Max_leg,`date` from
(
SELECT * FROM network t2 where id in (select id from
(select id,uid,`date` from (SELECT * FROM network order by uid,
`date` desc) t4 group by uid) t3) and
(left_leg>=500 or right_leg>=500))t1

想要从网络中再次选择每个 uid 的最新日期的数据想要选择 left_leg >=500 或 right_leg >=500 的数据想要只选择两条腿中较大的一条(左腿或右腿)

整个查询可能有一些问题,但核心问题在于这段代码

SELECT * FROM network t2 where id in (select id from
(select id,uid,`date` from (SELECT * FROM network order by uid,
`date` desc) t4 group by uid) t3)

我想改进这个查询,因为当数据增长时它获取结果的速度非常慢。

4

2 回答 2

2

接受你的描述:

  • 首先找到每个uid的最大日期
  • 然后找到关联ID
  • 过滤腿值

例子:

SELECT id, uid, GREATEST(left_leg, right_leg) as max_leg
  FROM network
  WHERE (uid, `date`) IN (SELECT uid, MAX(`date`)
                            FROM network
                            GROUP BY uid)
    AND (left_leg > 500 or right_leg > 500)

请注意,这意味着如果 uid 的最新日期不包含大于 500 的部分,则记录将不会显示在结果中。如果您想要腿 > 500 的最新记录,则必须移入腿过滤器。

于 2013-06-21T01:20:13.223 回答
2

在 (uid,date) 上添加索引:

ALTER TABLE network ADD INDEX uid_date( uid, date )

并尝试类似:

SELECT n.id, n.uid, greatest( n.right_leg, n.left_leg ) as max_leg, n.date
FROM
  ( SELECT uid,max(date) as latest FROM network
    WHERE right_leg>=500 OR left_leg >=500
    GROUP BY uid
  ) ng
JOIN network n ON n.uid = ng.uid AND n.date = ng.latest
于 2013-06-21T01:04:52.267 回答