我有一个friends
表:id
, fid1
, fid2
代表两个用户之间的友谊(双向)。
和一个用户
表:fid
,name
我想创建一个函数或查询
- 用户编号
返回
- 好友列表(users.fid, users.name)代表所有与原始用户id为好友的好友
我在嵌套 JOIN 和 UNION 时遇到了问题。我需要 UNION 来确保我得到所有的友谊(但也不要重复)。这是我到目前为止所得到的:
SELECT fid1 as friends FROM friendships WHERE fid2 = 123456
INNER JOIN users
ON friendships.fid1 = users.fid
UNION ALL (
SELECT fid2 as friends FROM friendships WHERE fid1 = 123456
INNER JOIN users
ON friendships.fid2 = users.fid
)
这是一个错误:
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'INNER JOIN users ON friendships.fid1 = users.fid UNION ALL ( SELECT fid2' at line 2
一般来说,我在使用命令时遇到问题,因为我不明白 SQL 如何处理结果 - 在正常的编程语言中,我会将 INNER JOIN 的结果传递给 UNION,然后应用该函数。但是我在这里有点迷路了。有什么想法吗?
最佳答案
WHERE
需要在 JOIN
之后进行
SELECT f.fid1 AS friends
FROM friendships AS f
INNER JOIN users AS u ON f.fid1 = u.fid
WHERE f.fid2 = 123456
UNION ALL
SELECT f.fid2 AS friends
FROM friendships AS f
INNER JOIN users AS u ON f.fid2 = u.fid
WHERE f.fid1 = 123456
Joins 上的视觉文章
正如您从 SELECT
语法中看到的那样,您将所有表连接在一起,然后应用过滤器(WHERE 子句)。这将创建一个结果集。然后,您可以将其 UNION
与另一个相同格式(相同列数、相同数据类型)的结果集。
UNION
将返回所有不同的记录,UNION ALL
将返回第一个记录集,然后是第二个记录集,保持顺序。
选项 2
SELECT CASE
WHEN t.fid1 != 1 THEN t.fid1
ELSE t.fid2
END AS Friends
FROM
(
SELECT DISTINCT f.fid1, f.fid2
FROM friendships AS f
LEFT JOIN users AS u ON f.fid2 = u.fid
WHERE f.fid1 = 1 OR f.fid2 = 1
) AS t
选项 3
SELECT DISTINCT
TRIM(CASE
WHEN f.fid1 = 1 THEN ' '
ELSE f.fid1
END +
CASE
WHEN f.fid2 = 1 THEN ' '
ELSE f.fid2
END) AS Friends
FROM friendships AS f
LEFT JOIN users AS u ON f.fid2 = u.fid
WHERE f.fid1 = 1 OR f.fid2 = 1
我不确定哪个对您来说效果更好,可能想在您的真实条件下对其进行测试,我的显示所有三个的性能都相似,但我的数据很少,也没有用于测试的索引。
关于mysql - 在 SQL 中使用 UNION 调用嵌套 INNER JOIN - 相当迷茫,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8250007/