使用SQL中的UNION调用嵌套INNER JOIN - 相当丢失

lol*_*ter 0 mysql sql union join mysql-error-1064

我有一个friends表:id,fid1,fid2表示两个用户(双向)之间的友谊.

users表:fid,name

我想创建一个函数或查询

  1. 用户身份

并返回

  1. 朋友列表(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
)
Run Code Online (Sandbox Code Playgroud)

这是一个错误:

#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
Run Code Online (Sandbox Code Playgroud)

一般来说,我遇到命令问题因为我不理解SQL如何处理结果 - 在普通编程语言中我将INNER JOIN的结果传递给UNIONs然后应用该函数.但我在这里有点迷失.有什么想法吗?

Ada*_*ger 6

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
Run Code Online (Sandbox Code Playgroud)

关于联接的视觉文章

有关MySQL SELECT语法的信息

SELECT语法中可以看出,将所有表连接在一起,然后应用过滤器(WHERE子句).这会创建一个结果集.然后UNION,您可以使用相同格式的另一个结果集(相同的列数,相同的数据类型).

A UNION将返回所有不同的记录,a 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
Run Code Online (Sandbox Code Playgroud)

选项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
Run Code Online (Sandbox Code Playgroud)

我不确定哪个会对你有好处,可能想在你的真实条件下测试它,我的三个表现相似,但我的数据很少,而且我的测试没有索引.