php—从表a和b中选择,其中表a和表b中的记录在表c中不存在?

wgeznvg7  于 2021-06-25  发布在  Mysql
关注(0)|答案(3)|浏览(350)

我无法可视化要创建的查询的设置。
我有表a(用户)和表b(事件)。对于每一个活动,我都想要一个没有参加的用户列表。
我认为第三个表是必要的,它将用户与事件关联起来,同时包含用户和事件id。如果表中没有用户和事件id的组合,则用户没有参与。
我的查询需要如何查看才能返回未参加每个活动的每个用户的列表?
或者,我可以查询events表,遍历结果,对于每个事件,我可以查询第三个表中没有匹配event id的记录的用户。这似乎效率低下,而且显然是错误的,因为需要进行许多额外的db调用。

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

如有必要,欢迎提供更多信息。

r3i60tvu

r3i60tvu1#

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

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

x8diyxa72#

如果您只需要一个没有参加任何活动的用户列表,我们可以将users表连接到junction表 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;
ux6nzvsh

ux6nzvsh3#

尝试此查询!

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)

相关问题