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

2w2cym1i  于 2021-08-13  发布在  Java
关注(0)|答案(2)|浏览(282)

我有两个单独的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 ║
║   … ║   … ║
╚═════╩═════╝

不会让你去查关系的,所以:
鲍勃上了入门课
汤姆(2)上了入门和试用课程
乔(3)有介绍,审判和至少一个“实际”的过程
入门课程什么都不给,试用课程给任何实际课程打折扣。如果有人已经有一个实际的过程中,折扣已被授予在过去。因此,在查询的结果中,我只查找那些拥有试用课程(也可以选择入门课程)的用户ID,但不查找任何其他课程:

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

显然,我不能从结果中排除与入门课程或试用课程不匹配的行,因为这仍然会给我提供可能附加了其他课程的用户标识。
我忍不住想我错过了一个明显简单的解决方案。

wlsrxk51

wlsrxk511#

据我所知,你需要一个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<>在这里摆弄

yftpprvb

yftpprvb2#

我想你想要:

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 条件检查用户是否有试用课程。第二,他们没有非试用或入门课程。

相关问题