我有三个表,看起来像这样
堡垒
|id|lat|lon|
fort_sightings
|id|fort_id|team|
堡垒突袭
|id|fort_id|raid_level|
我需要一个从 forts
中获取所有行的查询然后从fort_sightings
中选择最新的信息和 fort_raids
, 如果有的话。 fort_id
可能有几行具有相同的值,所以我需要最新的信息。
目前,我有这个,可能不是最漂亮的
SELECT
*
FROM
forts c
LEFT JOIN fort_sightings o ON o.id = (
SELECT
id
FROM
fort_sightings
WHERE
fort_id = c.id
ORDER BY
id DESC
LIMIT 1
)
LEFT JOIN fort_raids r ON r.id = (
SELECT
id
FROM
fort_raids
WHERE
fort_id = c.id
ORDER BY
id DESC
LIMIT 1
)
但是速度慢得令人痛苦,查询需要 10 多秒。 forts
中只有约 350 行,所以真的不应该花这么长时间。我相信它来自所有 SELECT
JOIN
中的查询,但我不知道还有什么选择。
最佳答案
这是您的查询:
SELECT *
FROM forts c LEFT JOIN
fort_sightings o
ON o.id = (SELECT fs2.id
FROM fort_sightings fs2
WHERE fs.fort_id = c.id
ORDER BY fs2.id DESC
LIMIT 1
) LEFT JOIN
fort_raids r
ON r.id = (SELECT fr2.id
FROM fort_raids fr2
WHERE fr2.fort_id = c.id
ORDER BY fr2.id DESC
LIMIT 1
);
我发现它的结构很奇怪。但是,看看这是否有效:
fort_sightings(fort_id, id)
fort_raids(fort_id, id)
重要的是 fort_id
是索引中的第一个键。
如果这不起作用,那么您可能需要修改查询。
关于MySQL LEFT JOIN 只有最后一行非常慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44762805/