douzinei6926 2011-07-13 16:54
浏览 52
已采纳

PHP Propel ORM MySQL - 左对多加入

I have two tables one called meeting and one called attendance, attendance is a many to many relational database in the following format:

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

Meetings are in the following format:

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

There can only be one meeting row per meeting, but unlimited attendance rows per meeting (limited to for every possible user for every meeting).

How in SQL and/or Propel do I create something that would list all meetings where the (provided) user_id is either the owner_id in meetings OR were the user_id and invited in the attendance database.

I am looking for a result (based on the above data) when searching for userid 3 of:

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

I currently have the following which doesn't work really, and produces multiple rows per meeting (because the meeting exists more than once in the attendance DB).

$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;

Which is something like the below in 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) 

Thanks for your time,

  • 写回答

1条回答 默认 最新

  • dqs86517 2011-07-13 18:10
    关注

    This should get you all meetings that are owned by user_id 1, as well as all meetings that are attended by 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
    

    It's a bit clunky. Personally, I would consider adding an owner flag to the meetings_attendance table.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 c语言怎么用printf(“\b \b”)与getch()实现黑框里写入与删除?
  • ¥20 怎么用dlib库的算法识别小麦病虫害
  • ¥15 华为ensp模拟器中S5700交换机在配置过程中老是反复重启
  • ¥15 java写代码遇到问题,求帮助
  • ¥15 uniapp uview http 如何实现统一的请求异常信息提示?
  • ¥15 有了解d3和topogram.js库的吗?有偿请教
  • ¥100 任意维数的K均值聚类
  • ¥15 stamps做sbas-insar,时序沉降图怎么画
  • ¥15 买了个传感器,根据商家发的代码和步骤使用但是代码报错了不会改,有没有人可以看看
  • ¥15 关于#Java#的问题,如何解决?