SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 30.08.2010 23:50:30

Excitone
Участник
Зарегистрирован: 30.08.2010
Сообщений: 5

Запрос на выборку через таблицу связей

Здравствуйте!

Есть таблица "сущностей" entity, таблица связей сущностей entity2entity и таблица объектов object. Каждый объект содержит ссылку на одну из записей сущностей entityID. Вопрос в том как по одному заданному значению индекса сущности eID выбрать все объекты, у которых значение поля entityID связанно с заданным значением eID  через таблицу entity2entity?

Спасибо.

Неактивен

 

#2 31.08.2010 00:05:59

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: Запрос на выборку через таблицу связей

Через объединение?

SELECT o.*
FROM object o JOIN entity e ON (…) JOIN entity2entity m ON (…) JOIN entity x ON (…)
WHERE x.eID = $eid.

Кстати, а объект — сущность? wink Если нет — чем они отличаются? smile

Неактивен

 

#3 31.08.2010 00:43:56

Excitone
Участник
Зарегистрирован: 30.08.2010
Сообщений: 5

Re: Запрос на выборку через таблицу связей

paulus, спасибо за ответ.

paulus написал:

Через объединение?

А через что еще можно? Связанные подзапросы?

paulus написал:

SELECT o.*
FROM object o JOIN entity e ON (…) JOIN entity2entity m ON (…) JOIN entity x ON (…)
WHERE x.eID = $eid.

Я еще плохо знаю синтаксис операций объединения, поэтому пока не понятно как это работает. В скобках ON (...) должны быть условия присоединения? И зачем два раза присоединять таблицу entity?

paulus написал:

Кстати, а объект — сущность? wink Если нет — чем они отличаются? smile

Нет, объект это не сущность, я дал такие названия просто для примера. В данной модели сущности могут быть связанны между собой, а каждый объект может быть привязан только к одной сущности, но на одну сущность могут ссылаться несколько объектов.

Неактивен

 

#4 31.08.2010 00:55:36

Excitone
Участник
Зарегистрирован: 30.08.2010
Сообщений: 5

Re: Запрос на выборку через таблицу связей

Придумал вот такой запрос:

SELECT object.id
FROM object, entity2entity
WHERE
    (entity2entity.id1=@entId AND object.eId=entity2entity.id2)
    OR
    (entity2entity.id2=@entId AND object.eId=entity2entity.id1)

Здесь @entId это идентификатор заданной сущности, а связи между сущностями хранятся в entity2entity в полях id1 и id2, при этом заданный идентификатор может быть в любом из этих полей. Корректно ли составлен запрос? Если нет - поправьте пожалуйста. Спасибо.

Неактивен

 

#5 31.08.2010 01:37:19

Excitone
Участник
Зарегистрирован: 30.08.2010
Сообщений: 5

Re: Запрос на выборку через таблицу связей

Да, в приведенном мной выше запросе есть ошибка - итоговая таблица содержит дубликаты объектов по числу связей в таблице entity2entity.

Неактивен

 

#6 31.08.2010 01:48:56

Excitone
Участник
Зарегистрирован: 30.08.2010
Сообщений: 5

Re: Запрос на выборку через таблицу связей

Кажется проблема дубликатов решается просто - стоило добавить GROUP BY object.id.

SELECT object.id
FROM object, entity2entity
WHERE
    (entity2entity.id1=@entId AND object.eId=entity2entity.id2)
    OR
    (entity2entity.id2=@entId AND object.eId=entity2entity.id1)
GROUP BY object.id

Так вроде работает.

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson