Как присоединиться к mysql таблицам

У меня есть старая таблица как это:

user> id | name | address | comments

И теперь я должен составить таблицу "псевдонима", чтобы позволить некоторым пользователям иметь имя псевдонима по некоторым причинам. Я составил новую таблицу 'user_alias' как это:

user_alias> name | user

Но теперь у меня есть проблема, должная мой плохой уровень SQL... Как присоединиться к обеим таблицам для генерации чего-то вроде этого:

1 | my_name    | my_address    | my_comments
1 | my_alias   | my_address    | my_comments
2 | other_name | other_address | other_comments

Я имею в виду, я хочу сделать "ВЫБОР..." запросом, который возвращается в том же формате как "пользовательская" таблица ВСЕ пользователи и ВЕСЬ псевдоним.. Что-то вроде этого:

SELECT user.* FROM user LEFT JOIN user_alias ON `user`=`id`

но это не работает на меня..

6
задан Michael Petrotta 23 March 2010 в 16:27
поделиться

4 ответа

Что-то вроде

SELECT user.name, user.address, user.comment FROM user
UNION ALL
SELECT user_alias.alias, user.address, user.comment 
   FROM user INNER JOIN user_alias on user.name = user_alias.name
ORDER BY name

приблизит вас к тому, чего вы хотите.

Вам нужно ОБЪЕДИНЯТЬ два SELECT вместе, потому что решение LEFT JOIN, предложенное другими, будет включать только одну строку в результирующий набор для пользователей с псевдонимами, а не две, как указано в вашем вопросе.

Но вы должны сделать общий столбец, объединяющий пользователя и псевдоним, столбцом id, а не столбцом имени.

2
ответ дан 17 December 2019 в 00:07
поделиться

Думаю, вам понадобится что-то вроде этого:

SELECT user.*
FROM user
LEFT JOIN user_alias
ON user.name=user_alias.name

Ваш исходный запрос не был достаточно конкретным в условии соединения.

3
ответ дан 17 December 2019 в 00:07
поделиться

Прежде всего - запрос, который вы хотите построить, нетривиален, потому что вы пытаетесь получить некоторые результаты, охватывающие более чем одну строку. Итак, я предложу вам подходящее решение таким, каким оно должно быть (читайте: так, как это сделает разработчик базы данных :-).

Во-первых, вы должны изменить свою таблицу user_alias так, чтобы она содержала столбец id , но не имя. Не рекомендуется объединять таблицы с использованием поля name . Причина в том, что Сары Коннор могло быть двое.

Затем вы можете получить результаты из обеих таблиц, используя этот запрос:

SELECT user.*, user_alias.*
FROM user LEFT JOIN user_alias
ON user.id=user_alias.id

Таким образом вы получите свои результаты в таком формате:

id | name         | address      | comments   | user
-------------------------------------------------------------
 1 | Sarah Connor | Planet Earth | Nice woman | sarah_connor
 2 | Sarah Connor | USA, NY      | Mean woman | sarah_c
 3 | John Connor  | USA, NY      | n00b       | john123

В ситуациях, когда есть две или более записей в user_alias для того же человека (равно id ), вы получите что-то вроде этого:

id | name         | address      | comments   | user
-------------------------------------------------------------
 4 | Bill Clinton | White House  | President  | bill
 4 | Bill Clinton | White House  | President  | monica
0
ответ дан 17 December 2019 в 00:07
поделиться
SELECT user.* FROM user LEFT JOIN user_alias ON user.name = user_alias.name
2
ответ дан 17 December 2019 в 00:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: