【问题标题】:PHP Propel ORM MySQL - Left Join on Many to ManyPHP Propel ORM MySQL - 多对多的左连接
【发布时间】:2011-07-13 16:54:30
【问题描述】:

我有两张表,一张叫会议,一张叫出勤,出勤是一个多对多关系数据库,格式如下:

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 和受邀者。

我在搜索以下用户 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) 

感谢您的宝贵时间,

【问题讨论】:

  • 你想做什么:获取所有拥有/参加会议的用户的用户ID?或者您是否想要获取由特定用户拥有/参加的所有会议(如您的查询所示)?
  • 后者,抱歉,您能指出问题在哪里误导了您,以便我更正吗?
  • 架构后的第二段:“我如何在 SQL 和/或 Propel 中创建一些内容,以列出所有用户,这些用户要么是会议中的 owner_id,要么是 user_id 并在出席数据库中被邀请。”
  • 更正并添加了一个新表 xD ty

标签: php mysql join symfony1 propel


【解决方案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

有点笨拙。就个人而言,我会考虑在meetings_attendance 表中添加一个owner 标志。

【讨论】:

    猜你喜欢
    • 2013-05-16
    • 2010-12-31
    • 2012-03-21
    • 1970-01-01
    • 1970-01-01
    • 2018-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多