1

有 3 个表:events、eventClients 和 clients。

编写一个查询来查找所有客户端都可以访问的事件?

内连接不保证表中的所有行都参与,所以这无济于事:

select * from events e
inner join eventclients ec on e.id = ec.eventid
inner join clients c on etc.clientid = c.id
4

3 回答 3

3

您可以使用嵌套NOT EXISTS来检查:

SELECT e.* 
FROM   events e 
WHERE NOT EXISTS(
    SELECT 1 FROM  client c 
    WHERE NOT EXISTS(
        SELECT 1 FROM eventclients ec 
        WHERE ec.eventid = e.id AND c.id= ec.clientid 
    )
)

Demo

于 2013-10-28T09:10:17.103 回答
1

你也可以做

SELECT e.id, e.name
  FROM events e LEFT JOIN eventclients ec
    ON e.id = ec.eventid LEFT JOIN clients c
    ON ec.clientid = c.id
 GROUP BY e.id, e.name
HAVING COUNT(ec.clientid) = 
(
  SELECT COUNT(*) FROM clients
)

这是SQLFiddle演示

于 2013-10-28T09:46:47.297 回答
0

假设您的意思是event与client具有多对多关系,并且event_client是它们之间的桥梁表,那么您应该询问有关跨多对多关系的 SQL 连接的许多其他问题。

SQL多对多选择

如何过滤 SQL 结果中的 has-many-through 关系

于 2013-10-28T09:23:19.637 回答