PHP Propel ORM MySQL - левое соединение от многих ко многим - PullRequest
1 голос
/ 13 июля 2011

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

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 является либо владельцем_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) 

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

1 Ответ

0 голосов
/ 13 июля 2011

Это должно дать вам все собрания, которые принадлежат 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.

...