Выборка из двух таблиц с двумя условиями и подсчетами

Рейтинг: 1Ответов: 2Опубликовано: 21.12.2014

Сразу скажу, что я читал и документацию, и статьи, но это не сильно мне помогло, поэтому под конец дня решил обратиться за помощью сюда.

Суть проблемы:
Имеются две таблицы: registrations и users. У каждой регистрации есть два аргумента и реферальный идентификатор. У пользователей из примечательного есть поле selected.
Итого:

registrations  
=============
id - int  
arg1  - double  
arg2 - double  
refid  - int

users
=====
id - int  
selected - int
  1. Мне нужно выбрать пользователей, у которых selected = 1 из users.
  2. Для каждого из этих пользователей нужно посчитать сумму сумм двух аргументов в таблице registrations, где refid равен id пользователя из users (то есть для пользователя с id=5 получить все записи из registrations c refid=5 и получить сумму значений arg1+arg2 для каждой записи из registrations).
  3. В результате нужно получить все поля пользователей (как при SELECT * FROM users WHERE selected=1) и дополнительное с результатом 2-го пункта.

Читал про join'ы и функции по типу sum, но сложить это все в один запрос вообще не получается. Подскажите, пожалуйста, как это делается и во что углубляться.

Обновление

Мне нужны все юзеры с selected=1, даже если у них нет рефералов.

Если у пользователя 3 реферала, то этого пользователя нужно вернуть 1 раз, а в поле sum_args нужно вывести сумму результатов arg1+arg2 для каждого реферала. То есть:

id     arg1    arg2    refid
1       12      75       7
2       46      89       7
3       16       3       7

В sum_args для пользователя с id=7 должно получиться (12+75) + (46+89) + (16+3).

Ответы

▲ 2Принят
SELECT u.id, SUM(r.arg1+r.arg2) FROM users AS u
INNER JOIN registrations r ON u.id = r.refid
WHERE u.selected=1
GROUP BY u.id
▲ 1

Думаю, как-то так:

SELECT reg.*, reg.arg1 + reg.arg2 as sum_args 
FROM registrations reg, users u 
WHERE u.selected=1 AND u.id=reg.refid

=== Обновление

Смутили вы меня оператором SUM. :-)

Сейчас запрос работает правильно. Пример http://sqlfiddle.com/#!2/78fa8/5