gpt4 book ai didi

php - Mysql 子选择查询优化

转载 作者:太空宇宙 更新时间:2023-11-03 11:19:33 24 4
gpt4 key购买 nike

我每天运行一个查询来编译统计信息——但它似乎效率很低。这是查询:

SELECT a.id, tstamp, label_id, (SELECT author_id FROM b WHERE b.tid = a.id ORDER BY b.tstamp DESC LIMIT 1) AS author_id
FROM a, b
WHERE (status = '2' OR status = '3')
AND category != 6
AND a.id = b.tid
AND (b.type = 'C' OR b.type = 'R')
AND a.tstamp1 BETWEEN {$timestamp_start} AND {$timestamp_end}
ORDER BY b.tstamp DESC
LIMIT 500

这个查询似乎运行得很慢。为废话命名道歉 - 我被要求不要透露实际的表名。

之所以有子选择,是因为外层选择从表a中获取一行,并从表b中获取一行。但还需要知道表 b 中的最新 author_id,所以我运行一个子选择来返回那个。我不想在 php 循环中运行另一个选择 - 因为这也很低效。

它工作正常 - 我只需要找到一种更快的方法来获取此数据集。

最佳答案

如果 b.tstampb.tid 中是唯一的,请采用 OMG Ponies 的解决方案。

否则你可以尝试这个解决方案。它按 b.tstamp DESC 对整个结果进行排序,并根据 author_id 添加排名。外部选择仅采用 rank = 1 的行,这是每个 author_id 具有最大 tstamp 的行。

SELECT id, tstamp, label_id, author_id
FROM (SELECT id,
tstamp,
label_id,
author_id,
CASE
WHEN @author_id != author_id THEN @row_num := 1
ELSE @row_num := @row_num + 1
END AS rank,
@author_id := b.author_id
FROM a,
b,
(SELECT @row_num := 0, @author_id := NULL) y
WHERE a.id = b.tid
AND (status = '2' OR status = '3')
AND category != 6
AND (b.type = 'C' OR b.type = 'R')
AND a.tstamp1 BETWEEN {$timestamp_start} AND {$timestamp_end}
ORDER BY b.author_id, b.tstamp DESC
) x
WHERE x.rank = 1
LIMIT 500

我没有试过,如果不行请评论。

关于php - Mysql 子选择查询优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2087483/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com