2016-04-15 2 views
3

у меня есть некоторые данные в таблице, например, так:MYSQL: Как разделить влево присоединиться результаты в нескольких строках

пользователя

user_id name 
1  John 
2  William 
3  cindy 
4  Julian 
5  Monique 

книг из

user_id book_id 
1  1 
2  3 
3  5 
5  10 

винил

user_id vinyl_id 
1  6 
2  7 
3  8 
4  9 

Я хочу, чтобы один ЗЕЬЕСТ, который будет производить этот вывод:

user_id item_out 
1  1 
1  6 
2  3 
2  7 
3  5  
3  8 
4  9 
5  10 

Так, в порядке user_id и book_id/vinyl_id. Это возможно?

+0

Вы можете ПОЛНОСТЬЮ ПРИСОЕДИНИТЬСЯ к обеим таблицам и проверить с помощью IFNULL(), какой идентификатор должен отображаться. Помните об этом, если один и тот же идентификатор находится в обеих таблицах, вы выиграли, видите ли это винил или книгу. – Johan

+0

Если бы я был вами, я бы реструктурировал базу данных, пока вы все еще можете. сделайте одну таблицу 'product out' и добавьте столбец перечисления для типа. Структура, которую вы используете сейчас, кажется ошибочной, особенно потому, что они, похоже, используют один и тот же идентификатор (они должны быть уникальными) – Jester

+0

@Jester Этот пример не является моей реальной производственной проблемой, а лишь упрощенным примером. Реструктуризация базы данных не так проста и сложнее в моей реальной базе данных. Но ты прав. Я должен подумать о том, как реструктурировать этот компонент. – ma9ma

ответ

2

Вы должны UNION ALL результатами двух отдельных запросов:

SELECT u.user_id, book_id AS item_out 
FROM user AS u 
INNER JOIN books_out AS b ON u.user_id = b.user_id 

UNION ALL 

SELECT u.user_id, vinyl_id AS item_out 
FROM user AS u 
INNER JOIN vinyl_out AS v ON u.user_id = v.user_id 
ORDER BY user_id, item_out 

Первый возвращает результаты запроса из books_out таблицы, тогда как результаты второй возвращается из vinyl_out таблицы.

Примечание:ORDER BY пункта применяются к результирующему набору, который производится с помощью UNION ALL операции.

Demo here

+0

Спасибо, работает как шарм. В первый раз мне (нужно) использовать UNION ALL. – ma9ma

0

Try This Прокомментируйте, если какой-либо ошибки.

select u.user_id,b.book_id as item_out from user u left join 
books_out b on u.user_id = b.user_id 
UNION ALL 
select u.user_id,v.vinyl_id as item_out from user u left join 
vinyl_out v on u.user_id = v.user_id 
order by user_id;