PHP Propel ORM MySQL - левое соединение со многими ко многим

У меня есть две таблицы, одна из которых называется «совещание», а другая — «посещаемость». Посещаемость — это реляционная база данных «многие ко многим» в следующем формате:

Attendance:
    user_id | meeting_id | invited
    --------+------------+--------
    1       | 5          | 1
    2       | 5          | 0
    3       | 4          | 0
    3       | 5          | 1
    3       | 6          | 0

Встречи проходят в следующем формате:

Meetings:
    meeting_id | meeting_name | owner_id
    -----------+--------------+----------
    3          | Awesome      | 2
    4          | Boring       | 2
    5          | Cool         | 5
    9          | Sexy         | 3

Для каждого собрания может быть только одна строка собрания, но неограниченное количество строк посещаемости для каждого собрания (ограничено для каждого возможного пользователя для каждого собрания).

Как в SQL и/или Propel мне создать что-то, что будет перечислять все собрания, где (предоставленный) user_id является либо owner_id на собраниях, либо был user_id и приглашен в базе данных посещаемости.

Я ищу результат (на основе приведенных выше данных) при поиске идентификатора пользователя 3:

Result for userid3:
    meeting_id | meeting_name | owner_id
    -----------+--------------+----------
    5          | Cool         | 5     - Because userid 3 is attending meeting 5
    9          | Sexy         | 3     - Because userid 3 owns meeting 9

В настоящее время у меня есть следующее, которое на самом деле не работает и создает несколько строк на собрание (поскольку собрание существует более одного раза в базе данных посещаемости).

$criteria->addJoin(MeetingMeetingsPeer::ID, MeetingAttendancePeer::MEETING_ID, Criteria::LEFT_JOIN);

$criterion = $criteria->getNewCriterion(MeetingMeetingsPeer::OWNER_ID, Meeting::getUserId());
$criterion->addOr($criteria->getNewCriterion(MeetingAttendancePeer::USER_ID, Meeting::getUserId()));

$criteria->add($criterion); 
return $criteria;

Что-то вроде приведенного ниже в SQL:

SELECT meeting_meetings.ID, meeting_meetings.OWNER_ID, meeting_meetings.GROUP_ID, meeting_meetings.NAME, meeting_meetings.COMPLETED, meeting_meetings.LOCATION, meeting_meetings.START, meeting_meetings.LENGTH, meeting_meetings.CREATED_AT, meeting_meetings.UPDATED_AT FROM `meeting_meetings` LEFT JOIN meeting_attendance ON (meeting_meetings.ID=meeting_attendance.MEETING_ID) WHERE (meeting_meetings.OWNER_ID=1 OR meeting_attendance.USER_ID=1) 

Спасибо за ваше время,


person Pez Cuckow    schedule 13.07.2011    source источник
comment
Что вы хотите сделать: получить идентификаторы всех пользователей, которые владеют собранием или посещают его? Или вы хотите получить все собрания, которыми владеет/посещает определенный пользователь (как указывает ваш запрос)?   -  person TehShrike    schedule 13.07.2011
comment
Последнее, извините, не могли бы вы указать, где вопрос ввел вас в заблуждение, чтобы я мог это исправить?   -  person Pez Cuckow    schedule 13.07.2011
comment
Второй абзац после схемы: Как в SQL и/или Propel мне создать что-то, что будет перечислять всех пользователей, которые были либо owner_id на собраниях, либо были user_id и приглашены в базе данных посещаемости.   -  person TehShrike    schedule 13.07.2011
comment
Поправил и добавил новую таблицу xD ty   -  person Pez Cuckow    schedule 13.07.2011


Ответы (1)


Это должно предоставить вам все собрания, принадлежащие user_id 1, а также все собрания, которые посещает user_id 1.

SELECT meeting_meetings.ID, meeting_meetings.OWNER_ID, meeting_meetings.GROUP_ID, meeting_meetings.NAME, 
meeting_meetings.COMPLETED, meeting_meetings.LOCATION, meeting_meetings.START, meeting_meetings.LENGTH, 
meeting_meetings.CREATED_AT, meeting_meetings.UPDATED_AT 
FROM `meeting_meetings`
WHERE `meeting_meetings`.`owner_id` = 1
UNION DISTINCT
SELECT meeting_meetings.ID, meeting_meetings.OWNER_ID, meeting_meetings.GROUP_ID, meeting_meetings.NAME, 
meeting_meetings.COMPLETED, meeting_meetings.LOCATION, meeting_meetings.START, meeting_meetings.LENGTH, 
meeting_meetings.CREATED_AT, meeting_meetings.UPDATED_AT 
FROM `meeting_meetings`
JOIN `meeting_attendance` ON `meeting_meetings`.`meeting_id` = `meeting_attendance`.`meeting_id` AND `meeting_attendance`.`invited`
WHERE `meeting_attendance`.`user_id` = 1

Это немного неуклюже. Лично я бы добавил флаг owner в таблицу meetings_attendance.

person TehShrike    schedule 13.07.2011