Объединение трех таблиц для работы только с одной

#mysql #sql

#mysql #sql

Вопрос:

У меня есть эти три таблицы в SQL для игры:

user_stats с идентификатором первичного ключа

 | userid | kills | deaths |
|--------|-------|--------|
|   10   |   5   |   4    |
 

user_items (товары, которые купил пользователь) с обычным целочисленным идентификатором первичного ключа — когда пользователь покупает новый товар, добавляется строка

 | id | userid | itemid |
|----|--------|--------|
|  1 |   10   |   1    | 
|  2 |   10   |   2    | 
|  3 |   10   |   3    | 
 

user_details (элементы, которые пользователь оснастил) с первичным ключом userid

 | userid | item1 | item2 |
|--------|-------|-------|
|   10   |   1   |   3   |
 

Я хочу иметь дело только с одной таблицей, но мне нужна вся информация, когда пользователь начинает. Я бы хотел объединить три таблицы в одну, но user_items имеет несколько строк для 1 пользователя, потому что вы можете купить несколько товаров. Будучи совершенно незнакомым с SQL, как мне это сделать?

Ответ №1:

Выполните a join для всех трех таблиц и получите конкретные данные, которые вы хотите, как показано ниже

 select us.*
from user_stats us
inner join user_item ui on us.userid = ui.userid
inner join user_details ud on us.userid = ud.userid
 

Поскольку все таблицы имеют общий столбец userid , вы также можете использовать NATURAL JOIN

 select *
from user_stats
natural join user_item
natural join user_details
 

Комментарии:

1. Большое спасибо, наверное, я просто упустил из виду этот вариант 🙂

2. Если бы я присоединился к таблицам в этом случае, он вернул бы 3 строки со всей информацией в каждой строке — из-за 3 строк в user_items, правильно? Если у одного пользователя много элементов, скажем, 50, повлияет ли объединение на производительность? Какой подход лучше?

3. @user1930226, это правильно. Это может быть так, а может и нет. В вашем случае, если вы видите, что все 3 строки будут одинаковыми (повторяющиеся строки). Поэтому, чтобы избежать этого, просто используйте distinct ключевое слово; которое в конечном итоге даст вам только 1 уникальную строку. Видишь эту скрипку sqlfiddle.com /#!2/5a6d1/5