запрос на объединение таблицы с двумя полями в один список, содержащий элементы в обоих полях - PullRequest
2 голосов
/ 29 августа 2011

Глядя на похожие вопросы, я на самом деле хочу прямо противоположное этому: SQL-запрос для получения данных в двух полях из одного столбца

У меня есть таблица собраний с парными пользователями:

A_user_id | B_user_id
1               2
3               4

Существует также таблица user .

Существует ли простой запрос 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- Как использовать в конце «order by» для упорядочения по результирующему списку «location_id», поскольку теперь у меня есть две именованные таблицы для работы.

Спасибо!

ОБНОВЛЕНИЕ 2:

Хорошо, я поместил два выбора в скобки и ОБЪЕДИНЯЛ их, и теперь я могу сделать заказ по 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 в поле location_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 ]

1 голос
/ 29 августа 2011
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
1 голос
/ 29 августа 2011
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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...