lol*_*ter 0 mysql sql union join mysql-error-1064
我有一个friends
表:id
,fid1
,fid2
表示两个用户(双向)之间的友谊.
和users
表:fid
,name
我想创建一个函数或查询
并返回
我在嵌套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然后应用该函数.但我在这里有点迷失.有什么想法吗?
你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)
关于联接的视觉文章
从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)
我不确定哪个会对你有好处,可能想在你的真实条件下测试它,我的三个表现相似,但我的数据很少,而且我的测试没有索引.
归档时间: |
|
查看次数: |
13935 次 |
最近记录: |