我有一个表,用于表示其他两个表之间的链接/关系,一个客户表和一个表组。一个组由一个或多个客户组成。链接表就像
APP_ID | GROUP_ID | CUSTOMER_ID
1 | 1 | 123
1 | 1 | 124
1 | 1 | 125
1 | 2 | 123
1 | 2 | 125
2 | 3 | 123
3 | 1 | 123
3 | 1 | 124
3 | 1 | 125
我现在有需要,给定一个客户ID列表,以便能够获取该客户ID列表的组ID。组ID可能不唯一,相同的组ID将包含相同的客户ID列表,但该组可能存在于多个app_id中。
我在想
SELECT APP_ID, GROUP_ID, COUNT(CUSTOMER_ID) AS COUNT
FROM GROUP_CUST_REL
WHERE CUSTOMER_ID IN ( <list of ids> )
GROUP BY APP_ID, GROUP_ID
HAVING COUNT(CUSTOMER_ID) = <number of ids in list>
将返回包含给定列表中所有客户ID的所有组ID,并仅返回那些组ID。因此,对于(123,125)的列表,将仅从上面的示例
返回组ID 2然后我必须链接app表以使用其创建的时间戳来识别该组所存在的最新应用程序,以便我可以从组表中提取正确/最新的信息。
有没有人想过这是否是最有效的方法?如果有另一种更快/更清洁的方式,我会感激你的想法。
答案 0 :(得分:2)
这闻起来像是一个分裂:
Other related stack overflow question
看一下所提供的链接,你会看到从关系代数的观点来看类似问题的解决方案,似乎不会更快,也可以更清晰。
我一开始并没有看你的解决方案,当我解决这个问题时,我发现你已经解决了这个问题。
实际上,我想到了这个:
<number of ids in list>
可以变成这样的东西(这样你就不需要额外的参数):
select count(*) from (<list of ids>) as t
但显然,我错了。如果我是你,我会继续使用你当前的解决方案。