2012-03-07 14 views
1

私はアンケートのためのデータベースデザインを持っています。MySQLの内部結合?

user_idがPKと名前のUSERSテーブルがあります。

question_idとquestion_textのQUESTION

POSSIBLE_ANSWER(answer_idはPK、値、テキスト)

また、ユーザーのQuestion_id、answer_idからuser_idを持つUSER_ANSWERSがあります。

私の質問に関連しない他の3つのテーブルもあります。

私が必要とするのは、名前が 'm%'のようなすべてのユーザーに対して、平均値(値)を選択することです。

これは明らかです。

答えて

2

は、次の試してください:あなたは 'M' で始まる名前を持つすべてのユーザーの平均をしたい場合は

select avg(PA.value) 
from POSSIBLE_ANSWER PA 
inner join USER_ANSWERS UA on PA.answer_id = UA.answer_id 
inner join USERS U on U.user_id = UA.user_id 
where U.name like 'm%' 
+0

'AVG()'にはグループが必要です。 – Crontab

+0

@Crontab:データベースによっては、必ずしも真ではないかもしれません。 GROUP BYが指定されていない場合、少なくともMySQLは結果セット内のすべての行の暗黙的なグループを作成します。 – PatrikAkerstrand

+0

@PatrikAkerstrand:答えに記載されているように、質問者が各ユーザーの平均を求めていると仮定していました。 – Crontab

2
SELECT u.user_id, u.name, AVG(pa.value) 
FROM USER_ANSWERS ua 
INNER JOIN POSSIBLE_ANSWER pa ON pa.answer_id = ua.answer_id 
INNER JOIN USERS u ON ua.user_id = u.user_id 
WHERE u.name LIKE 'm%' 
GROUP BY u.user_id 

GROUP BYを削除します。このクエリは、名前がmで始まる平均PERユーザーを示します。

2

あなたはこれを行うことができます:

SELECT u.name, AVG(pa.value) AS avgvalue 
FROM USER_ANSWERS ua 
INNER JOIN USERS u ON u.user_id = ua.user_id 
INNER JOIN POSSIBLE_ANSWER pa ON pa.answer_id = ua.answer_id 
WHERE u.name LIKE 'm%' 
GROUP BY u.name 

を、私はまだあなたがこれまでにしようとしているものを読むことに興味があるけど。そして、選択肢リストにu.user_idを追加して、それを代わりに(PatrikAkerstrandのように)追加することができます。名前が一意でない場合は、これを行う必要があります。