mysql - 在 SQL 中使用 UNION 调用嵌套 INNER JOIN - 相当迷茫

标签 mysql sql join union mysql-error-1064

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

和一个用户表: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
)

这是一个错误:

#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 上的视觉文章

MySQL SELECT syntax的资料

正如您从 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/

相关文章:

python - 无法在另一个python脚本中使用python函数的属性

mySQL str_to_date() 函数返回错误

sql - PostgreSQL:在对另一列进行排序时在单列上选择不同的值

php - 仅限页面显示

MySQL Before Delete 触发器以避免删除多行

sql - 不断变化( hibernate )数据模型,如何避免服务器关闭

Mysql:从每只猫[一对多关系]得到2个结果

r - 执行 st_union() 操作后如何将多多边形几何体分成多个多边形对象?

mysql - Docker 构建失败

mysql - 我需要帮助解决这个问题