mysql在表上相交,否则忽略

qfe3c7zg  于 2021-06-24  发布在  Mysql
关注(0)|答案(2)|浏览(259)

我一直在开发一个数据库,其中的表如下所示:

Customer
id    INTEGER, PRIMARY KEY
name  VARCHAR

Entrance
id    INTEGER, PRIMARY KEY
desc  VARCHAR

CustomerEntranceRestriction
idEntrance PK, FK to Entrance.id
idCustomer PK, FK to Customer.id

这个 CustomerEntranceRestriction 表中只包含客户只能使用的入口的条目。此表中没有记录的客户可以访问任何入口。
我想试着把每个顾客都能进入的所有入口都退回去。我的问题如下:

SELECT DISTINCT 
   c.id As customer_id, 
   e.id AS entrance_id 
FROM customer c 
JOIN entrance e 
LEFT JOIN CustomerEntranceRestriction cer1 
  ON cer1.idCustomer = cu.id 
LEFT JOIN CustomerEntranceRestriction cer2
  ON cer2.idEntrance = e.id 
WHERE   
   IF(cer1.idCustomer IS NULL, 0, cer2.idEntrance - e.id) = 0 
AND   
   IF(cer2.idEntrance IS NOT NULL,IF(cer2.idCustomer =cu.idCustomer,0,1),0) = 0

我认为这样做是对的,但我对逻辑的把握不够。左连接到 CustomerEntranceRestriction 表中的两个部分主键,我们可以包含 NULL 两个匹配项的值。匹配发生在 cer1 或者 cer2 我们检查是否有匹配的 c.id 或者 e.id ,删除失败的行。
这是合理的逻辑吗?我不确定它在关系数据库中是否有名称。
另一种方法是采取交叉连接的所有 Customer 以及 Entrance 中没有客户的记录 CustomerEntranceRestrction 以及 UNION 那些记录在 CustomerEntranceRestriction table。
如有任何建议,将不胜感激。

klh5stk1

klh5stk11#

通过使用适当的where和and可以避免if条件

SELECT DISTINCT 
     c.id As customer_id, 
     e.id AS entrance_id 
  FROM customer c 
  JOIN entrance e 
  LEFT JOIN CustomerEntranceRestriction cer1 
    ON cer1.idCustomer = cu.id 
  LEFT JOIN CustomerEntranceRestriction cer2
    ON cer2.idEntrance = e.id 
  WHERE   cer1.idCustomer IS NULL
  AND   cer2idEntrance IS NOT NULL AND cer2.idCustomer = cu.idCustomer
eeq64g8w

eeq64g8w2#

我想你想要:

SELECT c.id As customer_id, 
       e.id AS entrance_id 
FROM customer c CROSS JOIN
     entrance e LEFT JOIN
     CustomerEntranceRestriction cer
     ON cer.idCustomer = c.id AND cer.idEntrance = e.id 
WHERE NOT EXISTS (SELECT 1 FROM CustomerEntranceRestriction cer2 WHERE cer2.idCustomer = c.idCustomer) OR
      cer.idEntrance IS NOT NULL;

这从顾客和入口的所有组合开始。它带来了任何限制。
这个 WHERE 条款的意思是:(1)客户没有限制,或者(2)允许客户进入。

相关问题