Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.02.13;
Скачать: CL | DM;

Вниз

Помогите сделать запрос с двойной связью   Найти похожие ветки 

 
Sens ©   (2005-01-10 08:49) [0]

Вкратце такая проблема:
Есть таблица пользователей

USER_ID
USER_NAME

Есть таблица событий:
Event_ID
Event_DATE (дата события)
Assaulter_ID (ID пользователя который атакует)
A_Type (тип атаки: атака или убийство )
Target_ID (ID пользователя который атакован)

Из этих двух таблиц я хочу получить одним запросом данные (создать новую таблицу) следующего рода:

USER_NAME (Имя пользователя)
Assault_COUNT (Количество атак этим пользователем)
TARGET_COUNT (Количество смертей/атакуемый этого пользователя)
USER_RATING (Расчетная формула рейтинга игрока в зависимости от значений Assault_COUNT и TARGET_COUNT).

Вот и мучаюсь, не знаю как такой запрос собрать. SQL ругается, говорит что не может быть одновременно связи из таблицы к двум записям в одном запросе.
А у меня USER.USER_ID Одновременно связан с Event.Assaulter_ID и Event.Target_ID.

Помогите пожалуйста, или объясните почему этого нельзя сделать.


 
Sens ©   (2005-01-10 09:38) [1]

Все спят, или никто не знает?


 
ЮЮ ©   (2005-01-10 09:49) [2]

>не может быть одновременно связи из таблицы к двум записям в одном запросе

Если таблица исполбзуется в запросе дважды, следует назначить им разные алиасы: ... FROM SomeTable t1, SomeTable t2 ...


 
Nexel   (2005-01-10 10:03) [3]

Да довольно тяжкий случай тут надо бы на мой взгляд не 2 а три таблицы
1) Пользователи
2) Атаки
3) Убийства смерти
Шаблон запроса вот такой для твоего случая
SELECT USER.USER_ID,USER.USER_NAME,
      EVENT.EVENT_ID,EVENT.EVENT_DATE,EVENT.ASSAULTER_ID,
      EVENT.A_TYPE,EVENT.TARGET_ID FROM USER
      LEFT JOIN EVENT ON EVENT.ASSAULTER_ID=USER.USER_ID
Это запрос просто на выборку всей дребедени


 
msguns ©   (2005-01-10 10:20) [4]

Очень похоже на таблицу платежей в банке ;))
Там тоже есть справочник контрагентов (дебиторы и кредиторы в одной куче) и каждая запись несет себе сведения об отправителе (убийце) и получателе (жертве). Естественно, с "походной выкладкой" : дата, № и т.д.

Если надо получить сводную картину по каждому контрагенту, сколько он "отдал", а сколько "получил", то ИМХО, делается через ХП (там UNION) и запрос к этой ХП


 
Sens ©   (2005-01-10 13:20) [5]

to msguns
Да, сходство с контрагентами есть, UNION как вариант рассматривал, но получается не совсем то. Можно конечно через UNION по каждому юзвергу сделать запрос (состояший из 2-х), потом полученные данные повтыкать в одну таблицу. Но мне так не особо хочется делать, причина: потеря скорости. Получается, что в Union группируются два запроса, прогоняется вся таблица юзеров цикле по каждому юзеру, а потом еще и результат вталкивается в третью таблицу... Реализовать можно, но хотелось бы обойтись без этого.


 
msguns ©   (2005-01-10 13:43) [6]

>Sens ©   (10.01.05 13:20) [5]
>Получается, что в Union группируются два запроса, прогоняется вся таблица юзеров цикле по каждому юзеру, а потом еще и результат вталкивается в третью таблицу... Реализовать можно, но хотелось бы обойтись без этого.

Охохох ! Какое "по каждому юзвергу" ? Где там "третья таблица" ?
Ну создаем ХП (VIEW), где тупо получаем такой НД:

- К/А    
- К/А - убийца  
- К/А - жертва
- "Выкладка" - все попутные реквизиты

Есстно, в одной записи может быть только "убийца" или только "жертва". Далее определяем вх.параметр - ID К/А. Если не указан, то "шлепаем" всех в ряд. Одним запросом с юнион. Где здесь "цикл по каждому юзерю" ?
А вот из этой ХП/вью и выбираем, что надоть со всякими агрегатами и группировками.

Что не ясно ?


 
Sens ©   (2005-01-10 15:53) [7]

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

Спасибо за советы.


 
Sens ©   (2005-01-12 16:25) [8]

Отвечаю на свой вопрос.
Автор ответа: Birjan (sql.ru)

SELECT t1.USER_ID, t1.USER_NAME,
      (select count(1)
       from events  
       where assaulter_id = t1.user_id) AS assault_count,
      (select count(1) from events
       where target_id = t1.user_id) AS target_count
FROM USERS AS t1;


 
msguns ©   (2005-01-12 16:36) [9]

С одновременной группировкой ? Тогда, ессно, нафиг нужен UNION. Но деталей нет. Или они не нужны ? Кстати, если бы была ХП, то можно было бы юзать ее и для получения деталей, и для итогов.


 
Sens ©   (2005-01-13 08:08) [10]

msguns ©   (12.01.05 16:36) [9]
А что такое ХП?


 
msguns ©   (2005-01-13 10:18) [11]

Хранимая процедура ;) В аксессе, правда, как таковых ХП нет ;( Зато там есть запросы, к которым можно давать запросы. По сути похлже на ХП (в смысле логики)



Страницы: 1 вся ветка

Текущий архив: 2005.02.13;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.056 c
1-1106839581
saNat
2005-01-27 18:26
2005.02.13
Длина текста через Canvas


3-1105514080
Scorpio
2005-01-12 10:14
2005.02.13
Как соединить 2 таблицы ч/з ADO


14-1106332272
Yanis
2005-01-21 21:31
2005.02.13
DHTML


4-1104310249
Yury
2004-12-29 11:50
2005.02.13
Количество логических дисков в системе


3-1105982109
denis24
2005-01-17 20:15
2005.02.13
adoquery.parameters