查询将具有两个字段的表联接到一个列表中,该列表包含两个字段中的项



看看类似的问题,我实际上想要的恰恰相反:从一列中获取两个字段中的数据的SQL查询

我有一张表与配对用户的会议

A_user_id | B_user_id
1               2
3               4

还有一个用户表。

有没有一个简单的mysql查询将所有的user_id都列在一个长列表中?

query result
1
2
3
4

我在想这样的事情,但它不起作用:

select *
from user 
where user.id in (
    (select A_user_id from meeting)
    or 
    (select B_user_id from meeting)
)

谢谢!

UPDATE(UNION解决了这个问题,但让我们让它更具挑战性(:

我想得到用户名和位置名的列表(两者都是引用表(,所以我需要将这个联合查询加入到它们中。以下是我尝试过的:

select u1.fname, l1.name
 from meeting m1
 join user u1 on m1.A_user_id=u1.id 
 join locations l1 on m1.location_id=l1.id
union
select u2.fname, l2.name
 from meeting m2
 join user u2 on m2.A_user_id=u2.id 
 join locations l2 on m2.location_id=l2.id
order by location_id asc

我有两个错误:

1-不确定我需要什么样的连接。(没有最后一行"按顺序"(我得到的名单只有2人(应该有4人,因为有2对人在开会(。它似乎只从并集的每个部分提取第一个项。我相信这与我为每个连接所做的类型有关,但不确定。因此,用户是不同的(会议表中只有一个用户,它只与用户表中的一个用户匹配(,但位置不是(两个用户在一个位置开会,我认为当我加入位置时,会把事情搞砸(。

2-我如何使用末尾的"orderby"来按"location_id"的结果列表排序,因为现在我有两个命名表要处理。

谢谢!

更新2:

好的,我把这两个选择放在括号里,然后UNIONed,现在我可以按location_id排序了。。。但我仍然不知道如何加入位置表。Mysql不喜欢我尝试的

(select u1.fname, m1.location_id
from meeting m1
join user u1 on m1.A_user_id=u1.id)
union
(select u2.fname, m2.location_id
from meeting m2
join user u2 on m2.B_user_id=u2.id)
#join locations l on l.id = location_id // this line messes things up *
order by location_id asc
  • 难道不需要围绕这整件事进行全面的选择吗?如何加入从联合查询中启动的"location_id"字段上的locations.id字段?既然"location_id"字段在技术上位于两个不同的表中?上面的联接引发了一个错误

更新3:已解决

这是我的最后一个问题:

select tb1.fname, l.name
from (
    (select u1.fname, m1.location_id
    from meeting m1
    join user u1 on m1.A_user_id=u1.id)
    union
    (select u2.fname, m2.location_id
    from meeting m2
    join user u2 on m2.B_user_id=u2.id)
) tb1
join locations l on l.id = tb1.location_id
order by location_id asc
select A_user_id as id from meetings
union
select B_user_id as id from meetings

在示例代码中,您可以使用"or",但如果您理解我的意思,"or"必须连接两个"in"语句。

select *
from user 
where 
(
      (user.id in (select A_user_id from meeting))
   or 
      (user.id in ((select B_user_id from meeting))
)

为了回答你的第二次更新,你想要类似的东西

select locations.* from
(
   (select A_user_id as id from meeting)
   union
   (select B_user_id as id from meeting)
) as UIDS
join
locations on locations.id = UIDS.id
select A_user_id as user_id from meetings
union all
select B_user_id as user_idfrom meetings
order by user_id

注:

  • UNION ALL保留重复项,UNION不保留
  • 任何ORDER BY都位于UNION的末尾

最新更新