MySQL在与变量不匹配的两列之一上进行连接

MySQL在与变量不匹配的两列之一上进行连接,mysql,database,where,Mysql,Database,Where,让我们直接开始吧:我在MySQL数据库中设置了两个简单的表,一个用户表和一个匹配表。users表包含用户。matches表用于在用户之间建立多对多连接,并且只包含两个userID 我们要查询的是userID为1的用户的所有匹配用户的名称列表,但我无法对其进行理解。问题是,在本例1中,userID可能位于任何一个字段中,而我不知道在哪个字段中 只是澄清一下;我的意思是这样的请不要介意奇怪的伪代码: SELECT users.name FROM matches INNER JOIN users

让我们直接开始吧:我在MySQL数据库中设置了两个简单的表,一个用户表和一个匹配表。users表包含用户。matches表用于在用户之间建立多对多连接,并且只包含两个userID

我们要查询的是userID为1的用户的所有匹配用户的名称列表,但我无法对其进行理解。问题是,在本例1中,userID可能位于任何一个字段中,而我不知道在哪个字段中

只是澄清一下;我的意思是这样的请不要介意奇怪的伪代码:

SELECT users.name 
FROM matches 
INNER JOIN users 
ON userId = (userId1 OR userId2 DEPENDS ON WHERE)
WHERE userId1 = '1' 
OR userId2 = '1';
你能告诉我MySQL是否可以做到这一点吗?如果可以,我应该寻找什么?如果你愿意,请举个简单的例子

非常感谢。

试试:

SELECT DISTINCT u.name 
FROM matches m
INNER JOIN users u 
ON (u.userId = m.userId1 AND m.userId2 = '1') 
    OR (u.userId = m.userId2 AND m.userId1 = '1')
添加了DISTINCT以避免重复行

看看这个。

类似这样的东西:

Select UserId1, UserId2
From Matches
Where UserId1 = 1
Union
Select UserId2, UserId1
From Matches
Where UserId2 = 1
请注意,Select子句中用户标识的顺序已更改。这将为您提供一个匹配列表,其中您在一列中搜索了用户“1”,在另一列中搜索了他们的所有匹配项

这种方法要求您在用户表中链接如下:

Select searchmatches.UserId1, searchmatches.UserId2, leftuser.Name, rightuser.name
From (
    Select UserId1, UserId2
    From Matches
    Where UserId1 = 1
    Union
    Select UserId2, UserId1
    From Matches
    Where UserId2 = 1
) searchmatches
inner join users leftuser userMatches.UserId1 = leftuser.UserId
inner join users rightuser userMatches.UserId2 = rightuser.UserId

希望有帮助!如果需要,您可以删除用户表的一个内部联接,因为您在其中搜索时知道左用户是谁

有一种方法可以避免过度的连接逻辑,以确保SQL可以在users.userId、matches.userId1、matches.userId2上使用索引

SELECT u.`name` 
FROM
matches AS m
JOIN users AS u
ON m.userId1=u.userId
AND m.userId2='1'

UNION

SELECT u.`name` 
FROM
matches AS m
JOIN users AS u
ON m.userId2=u.userId
AND m.userId1='1'
或处于连接条件的用户通常会阻止MySQL使用索引。使用union或union all使查询相当麻烦。您可以使用左侧外部联接执行任何操作:


这应该利用用户的索引来查找值。如果您想要不同的姓名,请添加不同的关键字。

我认为Oliver正在查找他们要查找的人的匹配姓名列表,不包括搜索到的个人姓名。我修复了错误的测试顺序。现在,这个查询不会返回搜索到的用户,除非两列中都有一行包含相同的用户。如果是这样,就没有理由排除它。再次感谢!我喜欢这个查询是多么简单,你是如何接近我所寻找的,这真的帮助了我!
SELECT coalesce(u1.name, u2.name) as name
FROM matches m LEFT JOIN
     users u1
     ON u.userId = m.userId1 AND m.userId2 = '1' LEFT JOIN
     users u2 
     ON u.userId = m.userId2 AND m.userId1 = '1'
WHERE '1' in (m.userId1, m.userId2);