2016-09-26 4 views
0

У меня сложная проблема, данные в db имеют три таблицы.

First_DBВставьте данные одной таблицы в db в другую таблицу db.

-- default_users 
id username email  password 
1 Timbog [email protected] vads7y3kkjdfa 
2 Marta [email protected] vads7y3kkjdfa 

-- default_album 
album_id album_name default_user_id 
    1  Name_Tim  1 
    3  Katarina  2 
-- default_album_img 
img_id  image_file album_id 
    3  1320229733.jpg  1 
    4  3320229733.jpg  3 

Second_DB

--users 
user_id user_name  user_email  user_pass  user_image 
    1  Timbog [email protected] vads7y3kkjdfa 1320229733.jpg 
    2  Marta  [email protected] vads7y3kkjdfa 3320229733.jpg 

подход я использовал для решения этой проблемы является первым получать все данные по внутреннему соединению, должен ли я использовать полное внешнее соединение и вставьте обязательное поле для моей таблицы, следующий запрос является фактическим, по которому я пытаюсь сделать это:

INSERT INTO bbpin.users (user_name, user_pin, user_email, user_password, user_img) 
SELECT default_users.username, default_users.bb_pin, default_users.email, default_users.password 
FROM bbmpins_pins.default_users 
INNER JOIN bbmpins_pins.default_album_images 
ON default_album_images.album_id = default_users.id; 

Я скучаю по тому, как я могу сравнить идентификатор двух таблиц в этом соединении, может быть? или этот запрос ошибочен подходом? В двух таблицах, которые являются sepearte в First_DB, может быть несколько записей, как мы можем связать их только с последней записью? Благодаря

ответ

1

Похоже, вы пытаетесь извлечь все строки из таблицы default_users. И вместе с каждой строкой также возвращайте соответствующие строки (строки) из таблицы default_album. И вместе с этим соответствующие строки (строки) из таблицы default_album_img.

Учитывая пример данных, запрос с использованием внутренних соединений будет возвращать указанный результат:

SELECT u.id    AS user_id 
     , u.username  AS user_name 
     , u.email   AS user_email 
     , u.password  AS user_pass 
     , i.image_file  AS user_image 
    FROM default_users u 
    JOIN default_album a 
    ON a.default_user_id = u.id 
    JOIN default_album_img i 
    ON i.album_id = a.album_id 

Этот запрос будет работать для примера данных.

Но, если есть строка в default_user, который не имеет соответствующую строку в default_album, то внутреннее соединение не будет возвращать эту строку:

-- default_users 
id username email   password 
3 branstark [email protected] warg2 

Или, если есть два или более строки в default_album, которые соответствуют данному пользователю, то запрос будет возвращать два экземпляр строки из default_user ...

-- default_album 
album_id album_name default_user_id 
    1  Tim2   1 

Без описания того, что должно быть возвращено в тех случаях, мы не можем рекомендовать запрос.

+0

, или мы могли бы просто сделать это один за другим, подход patty вставляет все данные из одной таблицы в другую без противоречивой таблицы, и когда это будет сделано, сопоставьте fk с ключом альбома и вставьте его, все равно нужно иметь дело с несколькими значениями –

+0

что, если я удалю первичный ключ таблицы пользователей как уникальный ключ, это поможет. мы можем это сделать? –

+0

Запрос действительно будет зависеть от того, что вы пытаетесь достичь. Если запрос внутреннего соединения создает набор, который является «отсутствующим» строком или имеет «дублированные» строки, тогда это можно решить. Мы могли бы использовать соединения OUTER, чтобы избежать «пропущенных» строк, или мы могли бы избежать объединения, используя коррелированный подзапрос в списке SELECT. Чтобы избежать «повторяющихся» строк, мы могли бы использовать либо GROUP BY, либо агрегатное выражение, либо (снова) коррелированный подзапрос в списке SELECT. Это действительно зависит от того, какой результат вы хотите вернуть. – spencer7593

1

Я не вижу ничего плохого в текущем подходе с использованием JOIN, но может изменить его немного, чтобы быть более удобным для чтения, а также вы должны соединить таблицу отношений с

INSERT INTO bbpin.users (user_id, user_name, user_pin, user_email, user_password, user_img) 
SELECT du.id, 
du.username, 
du.bb_pin, 
du.email, 
du.password, 
dai.image_file 
FROM bbmpins_pins.default_users du 
JOIN bbmpins_pins.default_album da ON du.id = da.default_user_id 
INNER JOIN bbmpins_pins.default_album_images dai 
ON dai.album_id = da.album_id; 
+0

, поскольку мы должны принять значение изображения из третьей таблицы, он сразу дает ошибку подсчета –

+0

@HabibRehman, см. Править в ответ, если это помогает. – Rahul

+0

та же ошибка, количество столбцов не соответствует значению. Думаю, может быть многократная вставка альбомов пользователем, и это может быть проблема? –

Смежные вопросы