Форум: "Базы";
Текущий архив: 2005.02.13;
Скачать: [xml.tar.bz2];
ВнизПомогите сделать запрос с двойной связью Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.039 c