2011-07-10 13 views
0

私は次の頭痛を持っています...私は3つの異なる句の平均評価を一度に取得しようとしています。最初のクエリ(averageRatingを求めるクエリ)からの値のみを検索します。 averageMaleRatingとaverageFemaleRatingは未知の列として返されます...1つのmysqlクエリで男性/女性/すべての平均投票評価を取得

そして、ここにクエリがあります!

SELECT 
    averageRating, 
    averageMaleRating, 
    averageFemaleRating 
FROM (
    SELECT 
    question_id AS q_id, 
    ROUND(AVG(rating)) AS averageRating 
    FROM 
    wp_ratings 
    WHERE 
    club_id = ? 
    GROUP BY question_id 

    UNION 

    SELECT 
    question_id AS q_id, 
    ROUND(AVG(rating)) AS averageMaleRating 
    FROM 
    wp_ratings 
    WHERE 
    club_id = ? 
    AND 
    GENDER = 'male' 
    GROUP BY question_id 

    UNION 

    SELECT 
    question_id AS q_id, 
    ROUND(AVG(rating)) AS averageFemaleRating 
    FROM 
    wp_ratings 
    WHERE 
    club_id = ? 
    AND 
    GENDER = 'female' 
    GROUP BY question_id 
)AS bigU 
JOIN 
    wp_ratings 
ON 
    wp_ratings.question_id = bigU.q_id 
+0

を評価テーブルに参加する必要があります。 – zneak

+0

ハァッ、ああ、とにかくそれを残念に...!テーブルスキーマにはいくつかのフィールドがありますが、これに必要なのは唯一のものです:club_id(int)、gender(enum、male、female)、question_id(int)、rating(int) –

答えて

2

あなたは完全に間違ったUNION文を使用しています。

あなたは、あなたのテーブルスキーマは、あなたの40ラインクエリよりも有用であろう質問表から選択し、それぞれの性別のために

SELECT 
    q.id, 
    AVG(t.rating) AS avgTotal, 
    AVG(m.rating) AS avgMale, 
    AVG(f.rating) AS avgFemale 
FROM questions AS q 

LEFT JOIN ratings AS t 
ON q.id = t.question_id 

LEFT JOIN ratings AS m 
ON q.id = m.question_id AND m.gender = 'male' 

LEFT JOIN ratings AS f 
ON q.id = f.question_id AND f.gender = 'female' 

GROUP BY q.id 
+0

ありがとうHnatt!私はちょっと私がそれを試したときにUNIONを間違って使っていることを知っていました:)乾杯! –

関連する問題