2017-11-14 19 views
0

この投稿に名前を付ける方法については、私には分かりません。テーブル1からテーブル2とテーブル3の平均ANDの異なる値をすべて選択する

私は3つのテーブルを持っています。そのような(単純化の例)のようなユーザー、食品と1と食品の利用者の評価との1、とワン:

SELECT fn.name as Food, ROUND(AVG(s.score),1) AS AvgScore FROM Foods fn LEFT JOIN Scores s ON fn.id = s.fid GROUP BY fn.id ORDER BY fn.name ASC 

として:今

Foods 
id name type 
--------------------- 
1 Apple fruit 
2 Banana fruit 
3 Steak meat 

Users 
id username 
----------------- 
1 Mark 
2 Harrison 
3 Carrie 

Scores (fid = food id, uid = user id) 
fid uid score 
--------------------- 
1 1 3 
1 2 5 
2 1 2 
3 2 3 

、私は完璧に動作し、このクエリを、持っています食べ物のすべてのユーザーからの平均を含めて、Foodsのすべての名前をリストアップすることができます。

また、独自のユーザー自身のスコアを追加したいと思います。私はいくつかの試みを行った

Food AvgScore Your Score 
Apple 4   3 

:あなたはマークとしてログインしている場合、私は、次の出力が必要

(マークがログインしているとき、彼のUIDは、セッション変数または任意に設定されているものとします)これを実現するには解決策を見つけることができません。私は、あなたが質問をしていると、あなたがする前に他の人がそれを尋ねてきた可能性が高いことを知りましたが、私はグーグルの言い方を知らないので、グーグルで答えることはできません。正しい方向のポインタは非常に高く評価されます。あなたがcaseで試すことができ

答えて

0

SELECT fn.name as Food, 
     ROUND(AVG(s.score),1) AS AvgScore, 
     sum(case s.uid = $uid when s.score else 0 end) as YourScore 
FROM Foods fn 
LEFT JOIN Scores s ON fn.id = s.fid 
GROUP BY fn.id 
ORDER BY fn.name ASC 

$uidは、オフコースの変数です。

+0

私はあなたの解決策をそのままコピーしてくれました。それは私にSQL構文エラーを与えましたが、私が求めたもの、つまり正しい方向のポインタをしたので解決策としてあなたの答えを受け入れます。私は前に "事件"を見たことがない - いくつかの試行の後、私はそれが私が欲しかったのと同じように働くようにした。とても感謝しています! :) 私はからそれを変更:に '合計(ケースs.uid = $ uidの他s.score 0終了)YourScore' として: ' sの後、= 2 s.uid合計(ケース.score else 0 end)YourScore'として –

+0

ようこそ。 :)おそらく '$ uid'が変数なので、エラーを出しました。 –

+0

いいえ、コメントを投稿したときに変更するのを忘れました。そして今、私はもう古すぎるのでコメントを編集できません。 –

関連する問題