Mysql 将两列合并为一列,同时保留其他列。然后与另一个表合并

Mysql 将两列合并为一列,同时保留其他列。然后与另一个表合并,mysql,sql,Mysql,Sql,我的桌子: // friendships +-----------------+-----------------+-----------------+ | fid | person1 | person2 | |-----------------+-----------------|-----------------+ +-----------------+-----------------+-----------

我的桌子:

//             friendships
+-----------------+-----------------+-----------------+
|      fid        |     person1     |     person2     | 
|-----------------+-----------------|-----------------+
+-----------------+-----------------+-----------------+
|       1         |    personid     |   personid      |
|-----------------+-----------------|-----------------+
|       2         |    personid     |   personid      |
|-----------------+-----------------|-----------------+

//             persons
+-----------------+-----------------+-----------------+
|      pid        |     firstname   |     lastname    | 
|-----------------+-----------------|-----------------+
+-----------------+-----------------+-----------------+
|       1         |    name         |    name         |
|-----------------+-----------------|-----------------+
|       2         |    name         |     name        |
|-----------------+-----------------|-----------------+
1)我想获取Friendlations表中包含某个personid的所有行。此id可以在person1或person2列中。应保留
fid
列,但
person
列应仅为一列,例如:

 Select fid, person1 as person, person2 as person FROM friendships
 WHERE person1 = some_personid
 OR person2 = some_personid;
(此查询中的2个人列应仅为一个)。我该怎么做


2) 我想加入fid.person=persons.pid上步骤1的结果的persons表

如果我理解正确,您需要所需人员的每个朋友的名字和姓氏,无论此人是
person1
还是
person2

在这种情况下,如果友谊关系不是对称的,可以通过子查询来实现

select  *
from    persons p
join    (
            select  fid, person1 as person, person2 as otherPerson
            from    friendship
            where   person1 = 'yourPerson'
            union all
            select  fid, person2 as person, person1 as otherPerson
            from    friendship
            where   person2 = 'yourPerson'
        ) f
 on    p.pid = f.otherPerson
如果是对称的,查询就容易多了,因为
person2
下的每一行都有一个与
person1
下的所需人员对应的行

select  *
from    friendship f
join    person p
on      f.person2 = p.pid
where   person1 = 'yourPerson'

如果我理解正确,您需要所需人员的每个朋友的名字和姓氏,无论此人是
person1
还是
person2

在这种情况下,如果友谊关系不是对称的,可以通过子查询来实现

select  *
from    persons p
join    (
            select  fid, person1 as person, person2 as otherPerson
            from    friendship
            where   person1 = 'yourPerson'
            union all
            select  fid, person2 as person, person1 as otherPerson
            from    friendship
            where   person2 = 'yourPerson'
        ) f
 on    p.pid = f.otherPerson
如果是对称的,查询就容易多了,因为
person2
下的每一行都有一个与
person1
下的所需人员对应的行

select  *
from    friendship f
join    person p
on      f.person2 = p.pid
where   person1 = 'yourPerson'

对于第一步,在where筛选器中使用OR子句来指示应该保存哪些记录。然后在select中使用case语句来选择哪个人

select    fid
        , case person1 when some_personid then person1 else person2 end as person
    from friendships
    where (person1 = some_personid
        or person2 = some_personid)
对于步骤二,您可以从persons中选择,并使用子查询从步骤1连接到表

select *
    from persons p
    inner join (
        select    fid
                , case person1 when some_personid then person1 else person2 end as person
            from friendships
            where (person1 = some_personid
                or person2 = some_personid)
    ) f on f.person = p.pid

希望这有帮助

对于第一步,在where筛选器中使用OR子句来指示应保留哪些记录。然后在select中使用case语句来选择哪个人

select    fid
        , case person1 when some_personid then person1 else person2 end as person
    from friendships
    where (person1 = some_personid
        or person2 = some_personid)
对于步骤二,您可以从persons中选择,并使用子查询从步骤1连接到表

select *
    from persons p
    inner join (
        select    fid
                , case person1 when some_personid then person1 else person2 end as person
            from friendships
            where (person1 = some_personid
                or person2 = some_personid)
    ) f on f.person = p.pid

希望这有帮助

友谊关系是对称的吗?我的意思是如果A是B的朋友,B也是A的朋友吗?友谊关系是对称的吗?我的意思是如果A是B的朋友,B也是A的朋友吗?