【发布时间】:2013-04-07 02:45:04
【问题描述】:
我正在尝试找到一个有效的查询来查找“连接”表中的所有匹配对象。
给定一个对象Adopter,它有很多Pets,以及Pets,它有很多Adopters,通过AdopterPets连接表。我怎样才能找到所有具有相同Pets 的Adopters?
架构相当规范化,看起来像这样。
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 和1 的id 询问具有相同Pets 的任何其他Adopters 时,您将被退回id 3。
如果您对Adopter 和3 的id 提出相同的问题,您会得到id 1。
如果您再次询问 Adopter with id 2` 的相同问题,您将一无所获。
我希望这有助于解决问题!
【问题讨论】:
-
“所有
Adopters都具有相同的Pets”是什么意思?和什么一样?另外,what have you tried? -
她很清楚地说明了她在代码块下面尝试了什么......
-
Group by可能会起作用,在应用group by之前,唯一地 将收养者收养的所有宠物聚合到一行中......比如(adopterid,'firstadoptedpetid.secondadoptedpetid.etc').是您可能想要用作连接符的任何字符。我没有说它会很有效,但我很确定这样的东西会起作用。 -
您的第二次编辑使您的情况看起来像您想要关系代数除法的应用程序(en.wikipedia.org/wiki/Relational_algebra#Division_.28.C3.B7.29)。 IIRC,这些查询当然是可写的,但也不是很容易写。我很想继续努力,但睡眠电话。
-
我仍然不完全确定您在寻找什么。在您的示例中,如果您向 id 为 2 的采用者提出问题(我假设
adopter_id?),您应该什么也得不到,但会得到 1 和 3:这两个采用者也都有 pet_id 1。
标签: sql postgresql query-optimization jointable