查询将包含两个字段的表连接到一个包含两个字段中的项的列表中

时间:2011-08-29 07:01:07

标签: mysql sql

看看类似的问题,我实际上想要与此完全相反: SQL query for getting data in two fields from one column

我与配对用户有一个会议表:

A_user_id | B_user_id
1               2
3               4

还有一个用户表。

是否有一个简单的mysql查询将 all user_ids列入一个长列表?

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)
)

谢谢!

更新(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-不确定我需要什么样的连接。 (没有最后'order by'行)我得到的列表只有2个(应该有4个,因为有2对人会议)。它似乎只是从联合的每个部分拉出第一个项。我相信这与我为每个人所做的联接类型有关,但不确定。因此,用户是不同的(会议表中只有1个用户,并且它只匹配用户表中的1个用户),但位置不匹配(2个用户在1个位置会议,我认为当我加入位置时,它是把事搞砸了。)

2-如何使用结果列表中的“location_id”按顺序使用“order by”,因为现在我有两个命名表要处理。

谢谢!

更新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

2 个答案:

答案 0 :(得分:1)

select A_user_id as id from meetings
union
select B_user_id as id from meetings

在您的示例代码中,您可以使用'或',但是'或'必须加入两个'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

答案 1 :(得分:1)

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结尾处