#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