2010-03-23 5 views
6

Я старый стол, как это:Как присоединиться к 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 ...» запрос, который возвращает в том же формате, как «пользователь» таблицы всех пользователей и псевдоним .. что-то вроде этого:

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

но это Безразлично я работаю для меня ..

ответ

2

Что-то вроде

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, а не столбца имен.

+0

Отлично! Это решение. Я не знаю, лучшее ли это, но это работает! Только небольшая ошибка: ВЫБРАТЬ user.name, user.address, user.comment ИЗ пользователя UNION ALL ВЫБОР user_alias.alias, user.address, user.comment ОТ пользователя INNER JOIN User_Alias ​​на user.id = User_Alias. пользователь ЗАКАЗ BY BY – Ivan

+0

О, я вижу ваш JOIN сейчас. Вы должны переименовать user_alias.user в user_alias.user_id, чтобы уточнить, что происходит. –

3

Я думаю, что нужно что-то вроде этого:

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

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

+0

Это производит только одну строку для id = 1, а не по запросу. –

+0

Да, не работает .. – Ivan

+0

Иван, см. Мой ответ ниже. –

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

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

Прежде всего, вы должны изменить таблицу 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

Проблема в том, что в ситуациях, когда в файле имеется только один псевдоним, вы возвращаете только одну строку в результирующем наборе. Но OP хочет вернуть две строки (строка пользователя и отдельная строка, объединяющая псевдоним из user_alias с адресом и комментариями из соответствующей строки пользователя). –

+0

В более общем плане проблема заключается в том, что при наличии каких-либо псевдонимов в файле вы не будете возвращать исходную неустановленную строку из таблицы пользователя. –