这里最大的效率杀手是相关子查询:
(SELECT CONCAT(name, " ", surname)
FROM pt_users us
WHERE us.uID = ph.uID) name_surname
... 和:
ifnull((SELECT SUM(vote)
FROM pt_votes vo
WHERE vo.pID = ph.pID),0) points,
对于使其通过WHERE子句的每一行,它们中的每一个都将运行一次。
要消除相关的子查询,您需要加入pt_votes和pt_users表。此外,因为您正在汇总您需要的选票GROUP BY,这意味着您确实SELECT *需要像评论中已经建议的那样摆脱它。
查询看起来像这样。当您确定pt_photos需要哪些列时,请务必将它们添加到GROUP BY列表中:
SELECT
pt_photos.pID,
pt_photos.uID,
pt_photos.this,
pt_photos.that,
CONCAT(pt_users.name, ' ', pt_users.surname) AS name_surname,
IFNULL(SUM(pt_votes.vote), 0) AS points
FROM pt_photos
JOIN pt_users ON pt_photos.uID = pt_users.uID
LEFT JOIN pt_votes ON pt_photos.pID = pt_votes.pID
WHERE 1
GROUP BY
pt_photos.pID,
pt_photos.uID,
pt_photos.this,
pt_photos.that
如果您的查询确实有一个WHERE 1子句,您可以删除它。