Mysql 当数据可以出现在一个表的多列中时,连接两个表的结果

Mysql 当数据可以出现在一个表的多列中时,连接两个表的结果,mysql,Mysql,我有一个包含用户列表的表,我只需要users.id和users.username 我有第二个表,将用户链接为“朋友”,我只需要从中获得friends.1和friends.2 我想输出一个结果,显示具有特定用户id的用户的所有朋友(这将是一个变量,但出于示例的考虑,我们将使用用户id“1”)。用户id“1”可以出现在friends.one或friends.two中 我尝试过一些不同的想法,但我不确定我是否更接近。下面的代码显然很糟糕,但我认为它很好地描述了这个想法(ish)。虽然我可能把事情复杂化

我有一个包含用户列表的表,我只需要users.id和users.username

我有第二个表,将用户链接为“朋友”,我只需要从中获得friends.1和friends.2

我想输出一个结果,显示具有特定用户id的用户的所有朋友(这将是一个变量,但出于示例的考虑,我们将使用用户id“1”)。用户id“1”可以出现在friends.one或friends.two中

我尝试过一些不同的想法,但我不确定我是否更接近。下面的代码显然很糟糕,但我认为它很好地描述了这个想法(ish)。虽然我可能把事情复杂化了,有一个更简单的方法

SELECT users.username, users.id 
FROM users 
INNER JOIN friends 
   ON users.id = friends.friendone 
WHERE friends.friendtwo='1'

UNION

SELECT users.username, users.id 
FROM users 
INNER JOIN friends 
   ON users.id = friends.friendtwo 
WHERE friends.friendone='1'
ORDER BY users.username ASC;
使用条件联接:

SELECT u.username, u.id 
FROM friends f INNER JOIN users u  
ON u.id = CASE '1'
  WHEN f.friendone THEN f.friendtwo
  WHEN f.friendtwo THEN f.friendone
END

你为什么说基于工会的解决方案很糟糕?您可能会发现这个答案中的描述很有用:因为它不起作用:)我不明白为什么您的联合查询不起作用。也许它只是需要一个小的修复。假设索引正确,它也是MySQL最快的解决方案。如果你的项目进展顺利,总有一天你会有几千个用户,而在接受的答案中加入这样一个没有使用索引能力的用户会让你在这里提出一个新问题。解决方案将是您的原始查询。刚刚发现错误:它应该是
orderbyusername ASC
-没有表前缀
users.
。如果不可能重复,您可能还想使用
UNION ALL
。哇,谢谢你,保罗,我想我离解决方案还远着呢。很高兴现在有两个选择。太棒了,谢谢。我不认为我会在一百万年内自己想出这个。