Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Помогите сделать запрос с двойной связью [D7, MSAccess]


Sens ©   (2005-01-10 08:49:00) 

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

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.

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


msguns   (2005-01-13 10:18:00) [1]

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


Sens   (2005-01-13 08:08:00) [2]

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


msguns   (2005-01-12 16:36:00) [3]

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


Sens   (2005-01-12 16:25:00) [4]

Отвечаю на свой вопрос.
Автор ответа: 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;


Sens   (2005-01-10 15:53:00) [5]

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

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


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

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

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

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

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

Что не ясно ?


Sens   (2005-01-10 13:20:00) [7]

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


msguns   (2005-01-10 10:20:00) [8]

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

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


Nexel   (2005-01-10 10:03:00) [9]

Да довольно тяжкий случай тут надо бы на мой взгляд не 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
Это запрос просто на выборку всей дребедени


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

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

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


Sens   (2005-01-10 09:38:00) [11]

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо