2016-09-20 6 views
1

私は親postsテーブルと子供votesposts.idvotes.post_idの関係を持っています。私は各投稿の平均評価を数えたいが、最新の投票数は50回にすぎない。 条件がそれぞれの親の平均

SELECT T1.`title`, (
    SELECT AVG(`vote`) 
    FROM `votes` 
    WHERE `votes`.`post_id` = T1.`id` 
) AS `average` 
FROM `posts` T1 
GROUP BY T1.`id` 

は、私はサブクエリで行うことが、この可能性を知っている:

SELECT T1.`title`, (
    SELECT AVG(`vote`) 
    FROM (
     SELECT `vote` FROM `votes` 
     WHERE `votes`.`post_id` = T1.`id` 
     ORDER BY `votes`.`id` DESC 
     LIMIT 10 
    ) AS T2 
) AS `average` 
FROM `posts` T1 
GROUP BY T1.`id` 

をしかし、エラーがある:私はすべての票のためにそれを行う方法を知ってError in query (1054): Unknown column 'T1.id' in 'where clause'が。 T1サブクエリで別名にアクセスできません。何か案は?

http://sqlfiddle.com/#!9/fb9341/2

答えて

1

さて、あなたはポストごとの最新の50行である行を選択します。このタイプのクエリのStack Overflowには、多くの場合、またはというタグの下に多数の回答があります。例:How to SELECT the newest four items per category?

一度あなたが投稿ごとにAVG(vote)を得るために、あなたがすでに書いている方法を知っているようにサブクエリを入れることができます。

あなたのコメントを再

これは私が何を意味するかである:あなたのSQLFiddle内のデータ与え

SELECT T1.title, AVG(V.vote) AS avg_vote 
FROM posts T1 
JOIN (
    SELECT v1.id, v1.post_id, v1.vote 
    FROM votes v1 
    LEFT OUTER JOIN votes v2 ON v1.post_id = v2.post_id and v1.id < v2.id 
    GROUP BY v1.id 
    HAVING COUNT(*) < 10 
) AS V ON T1.id = V.post_id 
GROUP BY T1.id; 

出力:

+---------+----------+ 
| title | avg_vote | 
+---------+----------+ 
| Title 1 | 5.4000 | 
| Title 2 | 4.2000 | 
+---------+----------+ 

サブクエリに参加しやすくするために列の上のvotesのインデックスを持つ必要があります(post_idid)。

SELECT T1.title, AVG(V.vote) AS avg_vote 
FROM posts T1 
JOIN (
    SELECT * 
    FROM (
     SELECT v.*, @r := IF(@p = post_id, @r+1, 1) AS rownum, @p := post_id 
     FROM (SELECT @p:=null, @r:=0) AS _init 
     CROSS JOIN votes v 
     ORDER BY v.post_id, v.id DESC 
    ) AS t 
    WHERE t.rownum <= 10 
) AS V ON T1.id = V.post_id 
GROUP BY T1.id; 

出力は前のクエリと同じです:


ここで一意の列を必要とせずに動作する別のソリューションです。

+0

ええ、でも、AVGが追加のサブクエリを作成するので、私は依然としてサブクエリにエイリアスを渡す必要があります。 – hlcs

+0

あなたはしません。外側のクエリを参照せずに 'votes.post_id'ごとにトップ50のクエリを行います。 'FROM'節でサブクエリとして行います。それを 'posts'テーブルに追加します。 –

+0

私はこれを行い、それは非常に遅い4.5秒です。 – hlcs

関連する問題