Php 从表A和表B中选择,其中表A和表B中的记录在表C中不存在?
我在可视化要创建的查询的设置时遇到问题 我有表A用户和表B事件。对于每一个活动,我都想要一个没有参加的用户列表 我认为第三个表是必要的,它将用户与事件关联起来,同时包含用户和事件ID。如果表中没有用户和事件ID的组合,则用户没有参加 我的查询需要如何查看才能返回未参加每个活动的每个用户的列表 或者,我可以查询events表,循环搜索结果,对于每个事件,我可以查询第三个表中没有匹配事件ID的记录的用户。这似乎效率低下,而且显然是错误的,因为需要进行许多额外的db调用Php 从表A和表B中选择,其中表A和表B中的记录在表C中不存在?,php,mysql,database,Php,Mysql,Database,我在可视化要创建的查询的设置时遇到问题 我有表A用户和表B事件。对于每一个活动,我都想要一个没有参加的用户列表 我认为第三个表是必要的,它将用户与事件关联起来,同时包含用户和事件ID。如果表中没有用户和事件ID的组合,则用户没有参加 我的查询需要如何查看才能返回未参加每个活动的每个用户的列表 或者,我可以查询events表,循环搜索结果,对于每个事件,我可以查询第三个表中没有匹配事件ID的记录的用户。这似乎效率低下,而且显然是错误的,因为需要进行许多额外的db调用 foreach ($getEv
foreach ($getEvents as $v) {
SELECT userID FROM users WHERE userID NOT IN (SELECT userID FROM tableC WHERE eventID = '".$v["eventID"]."');
}
如果需要,我们很乐意提供更多信息。如果您只需要一个没有参加任何活动的用户列表,我们可以将用户表加入连接表C,然后完成。然而,由于您需要所有事件的报告,我们需要不同的方法。一种选择是使用一个日历表,它表示每个用户与每个事件的关系。我们可以通过用户表和事件表之间的交叉连接生成此表。然后,左键将此日历表连接到连接表C
您可以通过生成所有用户/事件组合来处理此问题。然后,筛选出确实存在的:
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;
试试这个查询
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)
用户表和事件表中有哪些信息?是否有相应的字段?事件表和用户表之间没有关系。假设每个表中只有userID和eventID字段,而其他字段是不相关的。@NickDawes用户和事件之间必须存在某种关系,否则您的问题无法回答。C表似乎是用户和他们参加的活动之间的连接表。抱歉@TimBiegeleisen,我还没有创建第三个表,因此在这个阶段不存在任何关系。创建第三个表将引入这种关系,但是如何查询数据库以获得所需的结果呢?如果我想查询没有参加特定活动的用户,这个解决方案将是完美的,但是我想返回events表中每个活动的用户列表。结果集如下所示。。。eventID userID 1 1 2 1 3 2 1这表明用户1、2和3没有参加活动1,但用户2和3参加了活动2。嘿,蒂姆,我看到你编辑了你的回复-你有没有可能解释这个问题?戈登给出了类似的回答。基本思想是交叉连接用户和事件。这将给出一个表,其中列出了每个事件和用户。然后用C左键连接,只保留某个用户/事件不匹配的行。我明白了!因此,交叉连接创建了一个包含所有可能的用户/事件组合的表,查询的其余部分只是扫描第三个表以查找匹配项。不匹配的记录表明用户没有参加活动,因为第三个表中没有记录。我会很快设置好这个问题,然后关闭这个问题。是的,因此您缺少连接表C,然后您需要对日历表进行交叉连接。
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)