![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Помогите сделать запрос с двойной связью [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]Все спят, или никто не знает?