Есть таблица, содержащая следующие поля:
ID, FirstUserID, SecondUserID, FirstUserCount, SecondUserCount.
При этом гарантируется, что FirstUserID <= SecondUserID.
Нужно: за один проход посчитать сумму Count для пользователя, ID которого мы знаем.
Соответственно, нужно выбирать сначала FirstUserCount при условии FirstUserID <= UserID, а затем - SecondUserCount с условием FirstUserID > UserID, где UserID - переданный параметр. Суммировать можно в две различные переменные.
Могу ли я сделать это с помощью одного запроса MySQL?
Если нет, то как оптимально можно это сделать?
UPD: уникальность записи, а также то, что FirstUserID != SecondUserID - гарантируется.
Нужно: за один проход посчитать сумму Count для пользователя, ID которого мы знаем.
SELECT SUM(CASE
WHEN FirstUserID = @ID THEN FirstUserCount
WHEN SecondUserID = @ID THEN SecondUserCount
END) totalSum
FROM `table`;
Запрос даст неверный результат, если существует запись, где FirstUserID = SecondUserID = @ID. Но это ведь несложно исправить...
PS. Но куда как разумнее нормализовать структуру.
Так не пойдёт?
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 для возможности дальнейшей оптимизации с помощью индексов.
Как развивать веб-проекты в 2026 году: технологии, контент E-E-A-T и факторы доверия
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники