Я изменил данные и запрос принятого ответа.
Данные теперь являются образцом данных из 5-звездочной рейтинговой системы.
Функция теперь правильно использует средние значения всех сообщений.
Разница заключается в расчете этих средних значений, вместо PHP они рассчитываются в SQL для целей ответа.
Вы можете увидеть это в действии наSQL Fiddle: http://sqlfiddle.com/#!9/84d8b/2/2
Обновленный запрос
Новая скрипта: http://sqlfiddle.com/#!9/3cdfe/1/2
SET @avg_total_votes := (SELECT AVG(meta_value) FROM postmeta WHERE meta_key ='this_num_votes');
SET @avg_total_rating := (SELECT AVG(meta_value) FROM postmeta WHERE meta_key ='this_rating');
SELECT posts.ID,
posts.title,
getmeta_votes.meta_value AS votes,
getmeta_rating.meta_value AS rating,
( ( (@avg_total_votes * @avg_total_rating) + (getmeta_votes.meta_value * getmeta_rating.meta_value) ) / ( @avg_total_votes + getmeta_votes.meta_value ) ) AS factor
FROM posts
LEFT JOIN postmeta AS getmeta_votes ON posts.ID = getmeta_votes.post_id AND getmeta_votes.meta_key = 'this_num_votes'
LEFT JOIN postmeta AS getmeta_rating ON posts.ID = getmeta_rating.post_id AND getmeta_rating.meta_key = 'this_rating'
WHERE NOT getmeta_votes.meta_value = 0 AND NOT getmeta_rating.meta_value = 0
ORDER BY factor DESC;
Я обнаружил, что эта конструкция запроса намного быстреепредыдущий работал в течение 2 часов над набором данных более 2000 записей (более 1 000 000 строк wp_postmeta), пока не завершился.
Этот выполняется за 0,04 с.