SQL JOIN 查询写入

标签 sql join

我正在尝试编写一个涉及两个表的简单查询。 “person”表具有唯一的 person_idname ,“friends”表具有 person_idfriend_id ,它们是 person 表中 person_id 的 FK。

person:
<PK> int person_id 
varchar[45] name

friends: 
<PK> int person_id
<PK> int friend_id

我想选择第 1 个人的所有 friend 的名字。

我可以使用 IN 语句轻松完成此操作:
SELECT p.name FROM person p WHERE p.person_id IN (SELECT f.friend_id FROM friends f WHERE f.person_id = 1);

但是,我不擅长编写 JOIN 语句。有人可以帮我编写等效的连接吗?

显然,这是一个人为的例子,但我已经尝试过使用我的真实数据并且在概念上遗漏了一些东西。谢谢。

最佳答案

你想要这样的东西:

SELECT p.name, f.friend_id
FROM person AS p
INNER JOIN friends AS f ON p.person_id = f.person_id
WHERE p.person_id = 1

这使用 p.person_id = f.person_id 将两个表连接在一起

如果一个人没有 friend ,你不会得到任何行 - 如果你不想要这个,那么使用 LEFT JOIN 你会得到一行 NULL friend_id

编辑:如果你想加入 friend 回到人:
SELECT p.name AS person_name, friend.name AS friend_name
FROM person AS p                                         -- Our person
INNER JOIN friends AS f ON p.person_id = f.person_id     -- the join table
INNER JOIN person AS friend on f.friend_id = friend.id   -- Join back on person again
WHERE p.person_id = 1

也许您的应用程序需要像这样的 3 向连接,但更常见的是,您只需要如上所述的 2 向连接,或者像这样:
SELECT p.name, f.friend_id
FROM person AS p
INNER JOIN friends AS f ON p.person_id = f.friend_id
WHERE f.person_id = 1

这将为您提供所有与 person_id 1 是 friend 的人的姓名(但不是 person_id 1 的姓名)

关于SQL JOIN 查询写入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/334852/

相关文章:

sql - RBAR 与具有不同事务大小的基于集的处理的性能比较

java - 需要有关使用 SQL 和 java 程序的分离度的帮助

SQL 递归求和

php - MYSQL - 选择不与其他表连接的所有行

mysql - 如何优化这个 MySQL 查询? (交叉连接、子查询)

sql - 计算估计时间行

sql - Octopus Deploy - 执行脚本文件

SQlite使用不同的 "on"语句两次连接同一个表

mysql - 选择表 A 中的所有记录,即使其中一个或多个 ID(即 FK)不存在于表 B 中

mysql - 连接到 MySQL 中另一个表中的第 n 个最高值