我正在尝试在MySQL中编写存储过程。由于复杂的原因,我有一个聚合查询与一堆连接来查看对象ID,然后用更多连接(包括相同的表)进行另一个查询以获取一些数据
所以,像这样:
CREATE TEMPORARY TABLE ids ENGINE=MEMORY
SELECT MAX(child.id)
FROM parent
JOIN child ON child.parent_id = parent.id
WHERE
GROUP BY child.parent_id;
SELECT *
# MUST SELECT STUFF FROM PARENT, CHILD, AND STUFF JOINED ON CHILD
FROM child
JOIN parent ON parent.id = child.parent_id
# A BUNCH MORE JOINS HERE
WHERE child.id IN (SELECT * FROM ids);
DROP TEMPORARY TABLE IF EXISTS ids;
现在我注意到第一次选择需要0.000秒。第二个选择是否我用(1435,2352,43653,34534,...)等常量列表替换(SELECT * FROM ids)也需要0.000秒。
但是,使用临时表创建它们都需要0.6秒。 0.W WTH?
所以我的问题是如何跳过这个临时表创建,并只传递id列表?
此外,如果我将整个第一个选择作为子选择移动到第二个选择,那么整个过程需要更长的时间。超过一分钟,我放弃了等待。
答案 0 :(得分:1)
试试这个:
SELECT *
FROM (
SELECT parent.*, MAX(child.id) as max_id
FROM parent
JOIN child ON child.parent_id = parent.id
WHERE -- some where cond
GROUP BY parent.id
) as parents
JOIN child ON child.id = parents.max_id
-- other joins
并显示效果结果。