sql - 创建查询以在 "join"表中查找匹配对象

标签 sql postgresql query-optimization join

我试图找到一个有效的查询来查找“连接”表中的所有匹配对象。

给定一个对象 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     |
            +------------------+

当您询问 Adopterid1对于任何其他 Adopters具有相同的 Pets你会被退回id 3 .

如果您对 Adopter 提出了同样的问题与 id3你会得到 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/

相关文章:

mysql - 如何从mysql动态表中获取两列

postgresql - SELECT 的 EXECUTE ... INTO 未实现

mysql - 使用 Rails 4 中的 include 优化查询

mysql - WHERE 谓词的顺序和 SQL 优化器

php - 在插入 ZF2 之前获取最后一个 ID

sql - 为什么人们如此讨厌 SQL 游标?

sql - 找出每学期和每门类(class)中得分最高的学生的名字?

ruby-on-rails-3 - 允许用户创建动态模型属性?

java - 方法完成后 PostgreSQL 关闭连接

java - 如何优化最常出现的值(数亿行)的检索