У меня есть старая таблица как это:
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`
но это не работает на меня..
Что-то вроде
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, а не столбцом имени.
Думаю, вам понадобится что-то вроде этого:
SELECT user.*
FROM user
LEFT JOIN user_alias
ON user.name=user_alias.name
Ваш исходный запрос не был достаточно конкретным в условии соединения.
Прежде всего - запрос, который вы хотите построить, нетривиален, потому что вы пытаетесь получить некоторые результаты, охватывающие более чем одну строку. Итак, я предложу вам подходящее решение таким, каким оно должно быть (читайте: так, как это сделает разработчик базы данных :-).
Во-первых, вы должны изменить свою таблицу 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
SELECT user.* FROM user LEFT JOIN user_alias ON user.name = user_alias.name