2016-11-08 4 views
0

Я пытаюсь использовать два псевдоним (like_count и dislike_count) построить новое поле (оценки), который будет использоваться для целей заказа. Ниже приведен текущий фрагмент запроса, который не работает. Я получаю следующую ошибку при следующем запросе: «Неизвестный столбец« like_count »в полевом списке». Я искал аналогичный вопрос о SO, но не смог найти решение. У кого-нибудь есть идея, как это сделать?MySQL: Как использовать псевдоним для создания нового поля?

SELECT comment.id, comment.content, 

SUM(if(comment_reaction.type = 'like', 1, 0)) as like_count, 
SUM(if(comment_reaction.type = 'dislike', 1, 0)) as dislike_count, 

((like_count + 1.9208)/(like_count + dislike_count) - 
    1.96 * SQRT((like_count * dislike_count)/(like_count + dislike_count) + 0.9604)/
     (like_count + dislike_count))/(1 + 3.8416/(like_count + dislike_count)) 
as score, 

(SELECT comment_reaction.type FROM comment_reaction 
WHERE comment_reaction.person_id = :person_id 
AND comment.id = comment_reaction.comment_id) as my_reaction 

FROM comment 
LEFT JOIN comment_reaction ON comment.id = comment_reaction.comment_id 

WHERE comment.topic_id = :topic_id 
GROUP BY comment.id 
ORDER BY score DESC LIMIT 0, 10 
+0

Вы не можете использовать имя поля псевдонима в действии –

ответ

1

Оберните свой первоначальный запрос в производную таблицу. Затем добавьте новую колонку:

select dt.*, 
    ((like_count + 1.9208)/(like_count + dislike_count) - 
     1.96 * SQRT((like_count * dislike_count)/(like_count + dislike_count) + 0.9604)/
      (like_count + dislike_count))/(1 + 3.8416/(like_count + dislike_count)) 
    as score 

from 
(
SELECT 
    comment.id, comment.content, 

    SUM(if(comment_reaction.type = 'like', 1, 0)) as like_count, 
    SUM(if(comment_reaction.type = 'dislike', 1, 0)) as dislike_count, 

    (SELECT comment_reaction.type FROM comment_reaction 
    WHERE comment_reaction.person_id = :person_id 
    AND comment.id = comment_reaction.comment_id) as my_reaction, 

    FROM comment 
    LEFT JOIN comment_reaction ON comment.id = comment_reaction.comment_id 

    WHERE comment.topic_id = :topic_id 

    GROUP BY comment.id 
) dt 
ORDER BY score DESC 
+0

Что делать, если я хочу получить только 10 самых популярных комментариев? Будет ли этот запрос получать все комментарии, а затем применить LIMIT? Если это так, то производительность не выглядит нормально. –

+0

Я не вижу требования LIMIT в вопросе. Вы имеете в виду, что вы хотите 10 самых высоких баллов или что? – jarlh

+0

Да, вопрос не имеет этого, но я хотел бы знать ответ. Да, я имею в виду 10 самых высоких баллов. Как я знаю, мне нужно будет применить LIMIT к внешнему запросу, однако в этом случае внутренний запрос получит все комментарии, а затем внешний запрос будет сузить его, верно? Если это так, какова будет производительность? –

Смежные вопросы