查询以获取与某些外键相关但与其他外键无关的ID

时间:2020-05-22 12:37:31

标签: mysql sql

我有两个站点带有单独的Wordpress实例。一个正在获取WooCommerce的过程中,另一个正在使现有用户具有设置的组来访问课程。我将来可以通过商店出售这些课程。我要寻找的答案与Wordpress本身无关,但与SQL无关。我知道大多数数据是如何从一个表中获取的,或者通过轻微的联接而获取的,但对于最后一步却没有。请考虑以下内容:

用户表(多余,但为了澄清):

╔═════╦══════╗
║ UID ║ NAME ║
╠═════╬══════╣
║   1 ║ Bob  ║
║   2 ║ Tom  ║
║   3 ║ Joe  ║
║   … ║ …    ║
╚═════╩══════╝

课程表:

╔═════╦═════════════════════╗
║ CID ║ COURSE              ║
╠═════╬═════════════════════╣
║   1 ║ Introductory Course ║
║   2 ║ Trial Course        ║
║   3 ║ Actual Course 1     ║
║   … ║ …                   ║
╚═════╩═════════════════════╝

连接表,将用户从n到n连接到课程:

╔═════╦═════╗
║ UID ║ CID ║
╠═════╬═════╣
║   1 ║   1 ║
║   2 ║   1 ║
║   2 ║   2 ║
║   3 ║   1 ║
║   3 ║   2 ║
║   3 ║   3 ║
║   … ║   … ║
╚═════╩═════╝

不会让您查找人际关系,所以:

  • 鲍勃(1)参加了入门课程
  • Tom(2)进行了入门和试用课程
  • Joe(3)进行了介绍,试用和至少一门“实际”课程

入门课程不授予任何费用,试用课程不提供任何实际课程的折扣。如果有人已经有实际的课程,那么过去就已经给予了折扣。因此,在查询结果中,我仅查找具有试用课程,有选择的入门课程但没有其他课程的用户的用户ID:

╔════╗
║ ID ║
╠════╣
║  1 ║
║  2 ║
╚════╝

显然,我不能仅仅从结果中排除与入门课程或试用课程不匹配的行,因为这仍然会为我提供可能附加了其他课程的用户ID。

禁不住以为我缺少了一个显然简单的解决方案。

2 个答案:

答案 0 :(得分:0)

我想你想要

select j.uid
from junction j join
     course c
     on j.cid = c.cid
group by j.uid
having sum( c.course = 'Trial Course'  ) > 0 and
       sum( c.course not in ('Trial Course', 'Introductory Course') ) = 0;

第一个having条件检查用户是否具有试用课程。第二,他们没有非试用或入门课程。

答案 1 :(得分:0)

据我了解,您想要的UID不在3实际课程1中 而且我认为4是实际课程2,依此类推。

但是根据大学的不同,通常会针对不同的类别提供不同的入门课程和试用课程。

所以我认为您必须重新考虑您的策略,或者让我们看一看如何管理此策略

SELECT
    DISTINCT UID
FROM junction 
WHERE 
UID NOT IN (SELECT UID FROM junction WHERE CID >= 3)
| UID |
| --: |
|   1 |
|   2 |

db <>提琴here

相关问题