powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Многие-к-многим - можно ли группировать?
4 сообщений из 4, страница 1 из 1
Многие-к-многим - можно ли группировать?
    #36258115
Aequilibrium
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем привет. Возможно, простой вопрос, но сообразить никак не могу.

Дано.
Таблица объектов А (ida, namea). Таблица свойств В (idb, nameb). Таблица связей С (idc, idxa, idxb, probc), реализуюшая отношение многие-к-многим (+ вероятность каждого отношения).

Требуется.
Выполнить запрос вида "Получить все А, для которых (Б = Б1 или Б=Б2 ...) и (Б = Б3 или Б = Б4 ...)"
Решается на данный момент пересечением вида

SELECT ida FROM C INNER JOIN A ON idxa = ida INNER JOIN B ON idxb = idb WHERE (nameb = B1 OR nameb = B2)
INTERSECT
SELECT ida FROM C INNER JOIN A ON idxa = ida INNER JOIN B ON idxb = idb WHERE (nameb = B3 OR nameb = B3)

Но есть две проблемы.
Во-первых, использование INTERSECT представляется не самым быстрым вариантом. Можно ли как-то иначе?
Во-вторых, допустим у нас в результате среди прочих выбран объект А123, у которого есть связь А123-Б1 с вероятностью probc = 0.1, связь А123-Б2 с вероятностью probc = 0.2 и есть связь А123-Б3 с вероятностью probc = 0.3.
Требуется посчитать произведения пар вероятностей, т.е. для пары А123-Б1 и А123-Б3 (0.1 * 0.3), и пары А123-Б2 и А123-Б3 (0.2 * 0.3). В SELECT вставлять нельзя, не будет работать INTERSECT (вероятности-то разные). Сейчас это делается вторым запросом, по А, найденным запросом, приведенным выше. Но может можно как-то объединить в один запрос?
Спасибо за любые советы.

С уважением
...
Рейтинг: 0 / 0
Многие-к-многим - можно ли группировать?
    #36258132
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
самое простое - замените INTERSECT на JOIN.
...
Рейтинг: 0 / 0
Многие-к-многим - можно ли группировать?
    #36258142
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Насчет вероятностей - как-то так?
Код: plaintext
1.
2.
3.
4.
5.
SELECT t.ida, t.namea, B1.*, B2.*, B1.probc*B2.probc multi_probc 
FROM
(SELECT A.ida, A.namea, C1.idxb idxb1, C2.idxb idxb2
FROM A JOIN C C1 ON A.ida=C1.idxa JOIN C C2 ON A.ida=C2.idxa AND C1.idxb<>C2.idxb) t
JOIN B B1 ON t.idxb1=B1.idb
JOIN B B2 ON t.idxb2=B2.idb
Подзапрос можно и раскрыть, но тогда придется следить за планом.
...
Рейтинг: 0 / 0
Многие-к-многим - можно ли группировать?
    #36258443
Aequilibrium
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Приветствую,
Все работает! Поправил вероятности (это поле таблицы связей С, а не таблицы свойств В), в окончательном виде выглядит так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
SELECT filter.ido, filter.oname, qualities1.qname AS qname1, qualities2.qname AS qname2, filter.prob1*filter.prob2 AS multiprob
FROM
(SELECT objects.ido, objects.oname, links1.idxq AS idxq1, links2.idxq AS idxq2, links1.prob AS prob1, links2.prob AS prob2
FROM objects JOIN links links1 ON objects.ido=links1.idxo JOIN links AS links2 ON objects.ido=links2.idxo AND links1.idxq<>links2.idxq
) filter
JOIN qualities AS qualities1 ON filter.idxq1=qualities1.idq
JOIN qualities AS qualities2 ON filter.idxq2=qualities2.idq
WHERE
(qualities1.qname = 'Green' OR qualities1.qname = 'Red') AND
(qualities2.qname = 'Ship' OR qualities2.qname = 'Car')
Большое спасибо!
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Многие-к-многим - можно ли группировать?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]