Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Объединить два запроса в один, возможно ли?
 
 автор: itx   (26.10.2010 в 03:47)   письмо автору
 
 

Здравствуйте, есть такая задача:
Найти сумму в таблице, где 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 делать, но тогда какую связь между ними указывать?

  Ответить  
 
 автор: Trianon   (26.10.2010 в 10:25)   письмо автору
 
   для: itx   (26.10.2010 в 03:47)
 

цель?

схема БД для такого рода запросов не кажется наиболее подходящей...
Но тут, не зная в точности, что за данные лежат в таблице, советовать трудно.

  Ответить  
 
 автор: itx   (26.10.2010 в 10:46)   письмо автору
 
   для: 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


Результат работы, естественно, кешируется, данные только раз в неделю меняются.
Такой вариант решения меня устраивает, но смущает, что приходится создавать временную таблицу. Как решить такую задачу более правильно?

  Ответить  
 
 автор: Trianon   (26.10.2010 в 12:36)   письмо автору
 
   для: itx   (26.10.2010 в 10:46)
 

вопрос о цели объединения запросов в один остался без ответа.

Алсо, если хозяин встречи встречает гостя и устраивает с ним игрища, очки получают оба или только один, а другой лишь французский насморк из них?
Это, в общем-то, определяет, как можно построить таблицу результатов более нормализованно чтоли.

  Ответить  
 
 автор: itx   (26.10.2010 в 13:06)   письмо автору
 
   для: Trianon   (26.10.2010 в 12:36)
 

Цель - сделать все в человеческом, а не убогом виде:)
Надеюсь, что в итоге будет меньше нагрузки на сервер бд, возможно, будет лучше читаемость кода.

Оба получают, комбинации как в футболе: 0-3, 3-0 или 1-1

  Ответить  
 
 автор: Trianon   (26.10.2010 в 13:23)   письмо автору
 
   для: itx   (26.10.2010 в 13:06)
 

>Цель - сделать все в человеческом, а не убогом виде:)
Неправда, соединять несоединимое - антигуманно.

>Надеюсь, что в итоге будет меньше нагрузки

Она у Вас уже проявилась, эта нагрузка, что Вы с ней бороться решили да еще так причудливо?
>на сервер бд, возможно, будет лучше читаемость кода.
На деле же наоборот от сложного несбаллансированного запроса нагрузка вырастет, а читабельность уменьшится в разы.


>Оба получают, комбинации как в футболе: 0-3, 3-0 или 1-1

Так тогда куда разумнее держать не очки, а результат встречи: -1 | 0 | +1
Ну или, на худой конец , держать две записи на одну встречу.
Так хоть какая-то логика будет восстановлена.

UPD. Еще один вариант - вместо очков держать чужой ключ выигравшей команды.

  Ответить  
 
 автор: itx   (27.10.2010 в 07:58)   письмо автору
 
   для: Trianon   (26.10.2010 в 13:23)
 

спасибо за советы!

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования