sql - Postgres多对多映射sql查询

标签 sql postgresql relational-division

PostgreSQL 数据库

Table User
-----------
ID | Name

1  | John
2  | Bob
3  | Sarah


Table Photo
-------------
ID | Caption

1   | Vacation
2   | Birthday
3   | Christmas

Table Comment
--------------
ID | User ID | Photo ID| Text

1  |    1    |    1    | Mexico Looks Great
2  |    2    |    1    | Sure Does
3  |    3    |    1    | Too Hot
4  |    1    |    2    | Look at that cake
5  |    3    |    2    | No ice cream?
6  |    1    |    3    | So Happy

愿望:我想获得只有 John(1) 和 Sara(3) 评论过的所有照片。

我如何构建一个 SQL 查询来查找只有用户 #1 和用户 #3 的评论的照片,我想排除比这两个评论更多(或更少)的结果。

最佳答案

最清晰和最易读的方式是包含以下评论的照片:

User1 相交 User2 Except 任何其他用户

SQL Fiddle查询将返回:

SELECT *
FROM Photo
WHERE ID IN (
    SELECT "Photo ID" FROM Comment WHERE "User ID" = 1
    INTERSECT
    SELECT "Photo ID" FROM Comment WHERE "User ID" = 3
    EXCEPT
    SELECT "Photo ID" FROM Comment WHERE "User ID" NOT IN (1, 3)
)

关于sql - Postgres多对多映射sql查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23922850/

相关文章:

mysql - 在 MySQL Workbench 中从实时服务器更新 EER 图(使用 sql 命令)

sql - 在 View 中使用带有 SQL 函数的联接

mysql - 减少 mysql 查询

mysql - 为什么在 SQL 中不可避免地使用双重嵌套 NOT EXISTS 语句

mysql - 查找恰好包含两个给定 child 的单亲 ID

sql - 帮助 MySQL 加入

sql - 格式错误的数组文字 - PostgreSQL

sql - 我如何获得 PostgreSQL 中两个日期之间的季度数?

sql - 多个 LEFT JOIN - "left"表是什么?

SQL 其中连接集必须包含所有值但可能包含更多