2016-04-19 2 views
1

Я хочу, чтобы выбрать сообщения от пользователей, которые имеют конкретные последователь что выше, чем в среднем в целом (по сравнению с другими пользователями)MySQL: где отсчет выше среднего

Проблемы, когда я использую AVG() это ограничивает число сообщений/пользователей, проходящий через, но я не могу использовать GROUP BY j.id это испортит среднее количество и WHERE j2.fCount >= j2.oAvg перестает работать должным образом

Вот мой код

SELECT * FROM ( 

    SELECT j.*, ROUND(AVG(j.fCount)) as oAvg 
    FROM ( 

    SELECT p.id , COUNT(fCount.id) as fCount 
FROM `post` p 

LEFT JOIN `table` table ON ... 
LEFT JOIN `user` user ON .... 
LEFT JOIN `follow` fCount ON fCount.user_id=user.id AND fCount.follow_id=table.ids 
WHERE p.user_id=fCount.user_id 
group by p.id 


) j 
---- > `GROUP BY j.id` - BREAKS THE AVERAGE BELOW 
) j2 


WHERE j2.fCount >= j2.oAvg 

Спасибо :)

ответ

0

, потому что вы пытаетесь сравнить со средним значением, вам, возможно, придется дважды выполнять свой внутренний запрос.

SELECT *, 
    (SELECT AVG(fCount) as average FROM 
     (SELECT COUNT(fCount.id) as fCount 
     FROM post p 
     LEFT JOIN follow fCount ON fCount.user_id = p.user_id 
     GROUP BY p.id 
     )j1 
    )as average 
FROM 
    (SELECT p2.id, COUNT(fCount2.id) as fCount 
    FROM post p2 
    LEFT JOIN follow fCount2 ON fCount2.user_id = p2.user_id 
    GROUP BY p2.id 
)j2 
HAVING fCount >= average 

sqlfiddle просто заменить внутренние запросы j1 и j2 с J

, если вы просто хотите, чтобы запустить внутренний запрос, как только вы можете использовать пользовательские переменные для всего свой отсчет разделить его по количеству в рассчитать свой собственный средний, как этот

SELECT id,fCount,@sum/@count as average 
FROM 
(SELECT id, 
     fCount, 
     @sum := @sum + fCount as total, 
     @count := @count + 1 as posts 
FROM 
     (SELECT p.id,COUNT(fCount.id) as fCount 
     FROM post p 
     LEFT JOIN follow fCount ON fCount.user_id = p.user_id 
     GROUP BY p.id 
     )j, 
     (SELECT @sum:=0.0,@count:=0.0)initialize 
)T 
HAVING fCount >= average 

sqlfiddle

+0

Спасибо, но есть более эффективный способ сделать это? вместо того, чтобы считать его дважды – user6227254

+0

Я не думаю, что есть способ ... но я могу ошибаться –

+0

Я думаю, если бы вы действительно хотели, чтобы вы могли создать процедуру хранения, которая создает вашу таблицу j как временную таблицу. затем выполните запрос в этой таблице j, а затем, когда процесс хранилища будет завершен, вы можете его удалить. я не знаю, как еще вы можете это сделать, не запрашивая эту внутреннюю таблицу дважды –

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