我试图找到一个有效的查询来查找“连接”表中的所有匹配对象。
给定一个对象 Adopter
有很多 Pets
, 和 Pets
有很多Adopters
通过 AdopterPets
加入表。我怎样才能找到所有 Adopters
具有相同的 Pets
?
架构相当规范化,看起来像这样。
TABLE Adopter
INTEGER id
TABLE AdopterPets
INTEGER adopter_id
INTEGER pet_id
TABLE Pets
INTEGER id
现在我正在使用的解决方案循环遍历所有 Adopters
并随时询问他们的宠物,如果我们有火柴,请将其存储起来,以后可以使用,但我相信必须有更好的 SQL 使用方法。
我看过的一个 SQL 解决方案是 GROUP BY
但这似乎不是解决这个问题的正确方法。
编辑
为了进一步解释我正在寻找的内容,我将尝试举一个例子。
+---------+ +------------------+ +------+
| Adptors | | AdptorsPets | | Pets |
|---------| +----------+-------+ |------|
| 1 | |adptor_id | pet_id| | 1 |
| 2 | +------------------+ | 2 |
| 3 | |1 | 1 | | 3 |
+---------+ |2 | 1 | +------+
|1 | 2 |
|3 | 1 |
|3 | 2 |
|2 | 3 |
+------------------+
当您询问 Adopter
与 id
的 1
对于任何其他 Adopters
具有相同的 Pets
你会被退回id 3
.
如果您对 Adopter
提出了同样的问题与 id
的 3
你会得到 id 1
.
如果您再次询问 Adopter with
的相同问题id 2` 你什么也得不到。
我希望这有助于解决问题!
最佳答案
谢谢大家的帮助,我结合使用了一些东西:
SELECT adopter_id
FROM (
SELECT adopter_id, array_agg(pet_id ORDER BY pet_id)
AS pets
FROM adopters_pets
GROUP BY adopter_id
) AS grouped_pets
WHERE pets = array[1,2,3] #array must be ordered
AND adopter_id <> current_adopter_id;
在子查询中,我得到了按其收养者分组的 pet_id。 pet_ids 的排序是关键,因此主查询中的结果将不依赖于顺序。
在主查询中,我将子查询的结果与我要匹配的收养者的宠物 ID 进行比较。出于此答案的目的,特定采用者的 pet_id 由 [1,2,3] 表示。然后,我确保我正在比较的采用者不包含在结果中。
如果有人看到任何优化,或者是否有一种方法可以比较顺序无关紧要的数组,请告诉我。
关于sql - 创建查询以在 "join"表中查找匹配对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16007509/