2012-03-07 4 views
1

У меня есть проект базы данных для опроса.Внутренние соединения MySQL?

У меня есть таблица ПОЛЬЗОВАТЕЛЕЙ с user_id PK и именем.

ВОПРОС с вопросом question_id и question_text.

POSSIBLE_ANSWER с answer_id PK, значением, текстом.

Кроме того, у меня есть USER_ANSWERS с user_id от пользователей, Question_id, answer_id.

Также есть еще 3 таблицы, не относящиеся к моему вопросу.

Что мне нужно, выберите avg (значение) для всех пользователей, где name like'm% '.

Надеюсь, это ясно спасибо.

ответ

2

попробуйте следующее:

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: true, я предполагал, что искателю нужны средние значения для каждого пользователя, как вы упомянули в своем ответе. – 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, если вы хотите, чтобы среднее значение всех пользователей с именем, начинающимся с «м». Этот запрос дает среднему пользователю PER, имя которого начинается с m.

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) - что вам нужно будет сделать, если ваши имена не уникальны.

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