Сумма двух столбцов со своим условием для каждого за один проход MySQL

340
30 марта 2017, 20:02

Есть таблица, содержащая следующие поля: ID, FirstUserID, SecondUserID, FirstUserCount, SecondUserCount. При этом гарантируется, что FirstUserID <= SecondUserID.
Нужно: за один проход посчитать сумму Count для пользователя, ID которого мы знаем.
Соответственно, нужно выбирать сначала FirstUserCount при условии FirstUserID <= UserID, а затем - SecondUserCount с условием FirstUserID > UserID, где UserID - переданный параметр. Суммировать можно в две различные переменные.
Могу ли я сделать это с помощью одного запроса MySQL?
Если нет, то как оптимально можно это сделать?
UPD: уникальность записи, а также то, что FirstUserID != SecondUserID - гарантируется.

Answer 1

Нужно: за один проход посчитать сумму Count для пользователя, ID которого мы знаем.

SELECT SUM(CASE 
           WHEN FirstUserID  = @ID THEN FirstUserCount
           WHEN SecondUserID = @ID THEN SecondUserCount
           END) totalSum
FROM `table`;

Запрос даст неверный результат, если существует запись, где FirstUserID = SecondUserID = @ID. Но это ведь несложно исправить...

PS. Но куда как разумнее нормализовать структуру.

Answer 2

Так не пойдёт?

SELECT
(SELECT SUM(a.FirstUserCount) FROM tbl a WHERE a.FirstUserId = :userId) +
(SELECT SUM(b.SecondUserCount) FROM tbl b WHERE b.SecondUserId = :userId) as total;

Либо:

SELECT SUM(
  IF(FirstUserID   = :userId, FirstUserCount, 0) + 
  IF(SecondUserID  = :userId, SecondUserCount, 0)
) as total
FROM tbl;

Можно добавить WHERE FirstUserID = :userId OR SecondUserId = :userId для возможности дальнейшей оптимизации с помощью индексов.

READ ALSO
Обновить записи в таблице?

Обновить записи в таблице?

Есть задачаНужно вбить в поле процент, и на этот процент уменьшить увеличить поле price в выбранной категории, а значение которое было в поле...

205
ERROR 2006 (HY000): MySQL server has gone away

ERROR 2006 (HY000): MySQL server has gone away

При вводе любой команды через командную строку Windows возникает такая ошибка: ERROR 2006 (HY000): MySQL server has gone awayПроисходит реконнект и команда срабатывает...

209
MYSQL Вывод двух селектов в одну таблицу

MYSQL Вывод двух селектов в одну таблицу

Помогите, пожалуйста, не могу объединить два запроса в одинКаждый из них выводит строчку с нужными данными по итогу

282
TRANSACTION ISOLATION LEVEL в хранимой процедуре mysql

TRANSACTION ISOLATION LEVEL в хранимой процедуре mysql

Для MS SQL есть возможность установки TRANSACTION ISOLATION LEVEL в хранимых процедурахНапример:

225