|
|
|
| Здравствуйте, есть такая задача:
Найти сумму в таблице, где id пользователя в f_user_id и сумму, где id в s_user_id
а потом результаты сложить, где f_user_id=s_user_id. Сейчас использую два таких запроса, а потом все перебираю в цикле и складываю:
SELECT sum(p1.f_scores) as scores1 FROM `pair` as p1 GROUP BY f_user_id
SELECT sum(p2.s_scores) as scores2 FROM `pair` as p2 GROUP BY s_user_id
Можно ли обойдись как-нибудь одним запросом?
Пробовал уже через JOIN делать, но тогда какую связь между ними указывать? | |
|
|
|
|
|
|
|
для: itx
(26.10.2010 в 03:47)
| | цель?
схема БД для такого рода запросов не кажется наиболее подходящей...
Но тут, не зная в точности, что за данные лежат в таблице, советовать трудно. | |
|
|
|
|
|
|
|
для: Trianon
(26.10.2010 в 10:25)
| | В таблице хранятся данные прошедших турниров:
f_user_id - хозяин встречи
s_user_id - гость
в f_scores и s_scores - очки, набранные во встречи.
По этим данным мне нужно построить таблицу турнира(топ) пользователей. Для этого нужна сложить очки пользователя во встречах, где он был и хозяином и гостем.
От алгоритма, который в первом сообщении, отказался, слишком сложно получилось с конечной сортировкой.
Пока задачу решил созданием временной таблицы в формате: user_id, scores
CREATE TEMPORARY TABLE `top` (
SELECT
f_user_id as user_id,
f_scores as scores,
FROM pair )
UNION ALL (
SELECT
s_user_id as user_id,
s_scores as scores,
FROM `pair`);
SELECT user_id, sum( scores ) AS scores FROM `top` GROUP BY user_id ORDER BY scores DESC
|
Результат работы, естественно, кешируется, данные только раз в неделю меняются.
Такой вариант решения меня устраивает, но смущает, что приходится создавать временную таблицу. Как решить такую задачу более правильно? | |
|
|
|
|
|
|
|
для: itx
(26.10.2010 в 10:46)
| | вопрос о цели объединения запросов в один остался без ответа.
Алсо, если хозяин встречи встречает гостя и устраивает с ним игрища, очки получают оба или только один, а другой лишь французский насморк из них?
Это, в общем-то, определяет, как можно построить таблицу результатов более нормализованно чтоли. | |
|
|
|
|
|
|
|
для: Trianon
(26.10.2010 в 12:36)
| | Цель - сделать все в человеческом, а не убогом виде:)
Надеюсь, что в итоге будет меньше нагрузки на сервер бд, возможно, будет лучше читаемость кода.
Оба получают, комбинации как в футболе: 0-3, 3-0 или 1-1 | |
|
|
|
|
|
|
|
для: itx
(26.10.2010 в 13:06)
| | >Цель - сделать все в человеческом, а не убогом виде:)
Неправда, соединять несоединимое - антигуманно.
>Надеюсь, что в итоге будет меньше нагрузки
Она у Вас уже проявилась, эта нагрузка, что Вы с ней бороться решили да еще так причудливо?
>на сервер бд, возможно, будет лучше читаемость кода.
На деле же наоборот от сложного несбаллансированного запроса нагрузка вырастет, а читабельность уменьшится в разы.
>Оба получают, комбинации как в футболе: 0-3, 3-0 или 1-1
Так тогда куда разумнее держать не очки, а результат встречи: -1 | 0 | +1
Ну или, на худой конец , держать две записи на одну встречу.
Так хоть какая-то логика будет восстановлена.
UPD. Еще один вариант - вместо очков держать чужой ключ выигравшей команды. | |
|
|
|
|
|
|
|
для: Trianon
(26.10.2010 в 13:23)
| | спасибо за советы! | |
|
|
|