从表A和B中选择,表C中不存在表A和表B中的记录?

时间:2018-01-10 01:37:56

标签: php mysql database

我无法直观地查看我想要创建的查询的设置。

我有表A(用户)和表B(事件)。对于每个活动,我想要一个没有参加的用户列表。

我想第三个表是必要的,它将用户与事件相关联,同时包含用户和事件ID。如果表中没有用户和事件ID组合,则用户没有参加。

我的查询如何查看以返回未参加每个活动的每个用户的列表?

或者,我可以查询事件表,遍历结果,并且对于每个事件,我可以查询没有第三个表中具有匹配事件ID的记录的用户。这似乎是低效的,显然是错误的,因为许多额外的数据库调用已经完成。

foreach ($getEvents as $v) {
    SELECT userID FROM users WHERE userID NOT IN (SELECT userID FROM tableC WHERE eventID = '".$v["eventID"]."');
}

如有必要,很乐意提供更多信息。

3 个答案:

答案 0 :(得分:1)

您可以通过生成所有用户/事件组合来处理此问题。 然后,过滤掉那些存在的:

select e.event_id, u.user_id
from events e cross join
     users u left join
     userevents ue
     on ue.event_id = e.event_id and ue.user_id = u.user_id
where ue.event_id is null;

答案 1 :(得分:0)

如果您只想要一个没有参加单个活动的用户列表,我们可以将用户表加入联结表C并完成。但是,由于您需要报告所有事件,因此我们需要采用不同的方法。一种选择是使用表示每个用户与每个事件的关系的日历表。我们可以通过用户和事件表之间的交叉连接生成此表。然后,将此日历表连接到联结表C

SELECT t1.userID, t1.eventID
FROM
(
    SELECT DISTINCT u.id AS userID, e.id AS eventID
    FROM users u
    CROSS JOIN events e
) t1
LEFT JOIN tableC t2
    ON t1.userID = t2.userID AND
       t1.eventID = t2.eventID
WHERE t2.userID IS NULL;

答案 2 :(得分:0)

尝试此查询!

SELECT
         e.event_id     AS 'Event ID'   , 
         u.user_id      AS 'User ID' 
    FROM
         events         e               ,
         users          u 
    WHERE 
          e.event_id NOT IN (SELECT event_id FROM userevents)
    AND   
          u.user_id  NOT IN (SELECT user_id FROM users)