Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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
1-1106811370
s_pavell
2005-01-27 10:36
2005.02.13
Интересный модуль GraphicEx


1-1107087746
rolex
2005-01-30 15:22
2005.02.13
Как получить размер папки?


14-1106592053
netnetnet
2005-01-24 21:40
2005.02.13
UPX


3-1105599719
denis24
2005-01-13 10:01
2005.02.13
Tadotable.locktype


3-1105617878
Russko
2005-01-13 15:04
2005.02.13
Update Faild





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский