我对数据库处理很新鲜,但现在完全没有经验。但是,我遇到了问题。我需要制定一个SQL查询,将所有兼容的文章返回到一组其他文章(任意大小)。 该查询将由应用程序中的脚本生成,以搜索用户可以输入任何找到的文章应该可用(兼容)的文章列表的文章。
因此,对于商品编号A,B,...,N的列表,问题是:
“给我所有与A 和 B和......以及N”兼容的文章
问题只涉及一个表格;
兼容
artOne
artTwo
兼容中的每条记录表示兼容性关系,因此如果在一列中有文章编号A而在另一列中有B,则文章A和B是兼容的。 NB 订单对兼容性没有任何影响。
现在,给定一个文章列表,我希望能够生成一个返回所有兼容文章的查询。
例如,考虑表格 兼容
A B ---- 1 2 3 1 3 4
如果我想要所有与[1]兼容的文章,则查询将返回[2,3] 列表[2,3]生成的查询将返回[1] 从列表[1,3]生成的查询生成一个空列表。
不可否认,这可能不是解决问题的最佳方法,所以我也欢迎任何更好的解决方案。我认为这类问题需要某种类型的子查询,这是我尚未掌握的主题。
所以,我的问题是 - 有没有办法对数据库进行建模,以便以更简单的方式解决这个特定的问题,或者在任何情况下,有人可以帮助我制定查询以及它如何随着可变数量的变化而变化输入。任何关于这个主题阅读的指示也非常受欢迎。
非常感谢
马
答案 0 :(得分:1)
SELECT id
FROM (
SELECT B AS id
FROM compat
WHERE A IN (list)
UNION
SELECT A
FROM compat
WHERE B IN (list)
) q
GROUP BY
id
HAVING COUNT(*) = @cnt
,其中@cnt
是列表中的项目总数。
为了使其正常工作,您应该确保没有兼容性对在表中有两个条目(即,(1, 2)
和(2, 1)
一次性不好)。
最好有两个约束:一个确保该对是唯一的,另一个检查具有最少id
的文章是第一个:
ALTER TABLE compat ADD CONSTRAINT ux_compat_ab UNIQUE (A, B)
ALTER TABLE compat ADD CONSTRAINT cc_compat_order CHECK (A < B)
如果您执行此操作,则可以使用效率更高的UNION
替换UNION ALL
:
SELECT id
FROM (
SELECT B AS id
FROM compat
WHERE A IN (list)
UNION ALL
SELECT A
FROM compat
WHERE B IN (list)
) q
GROUP BY
id
HAVING COUNT(*) = @cnt
答案 1 :(得分:0)
从文章中选择* a ad = ct.ArticleAID的内连接compatTbl ct 其中ct.ArticleBID(ids列表在这里)