2013-07-22 3 views
1

У меня есть две таблицы, которые я соединяю, Users и Addresses.Слева присоединиться и показать не-иностранный ключ

Таблица пользователей имеет unique (but not primary) key called userID. Таблица Addresses имеет primary key called userID.

Я пытаюсь left-join таблицы, так что я получаю всю информацию из таблицы пользователей независимо от того, имеет соответствие в таблице адресов, поэтому я использовал

select * from users u left join addresses a on a.userID = u.userID 

Это работает, но только показывает идентификатор пользователя, если есть совпадение. Как получить идентификатор пользователя независимо от того, есть ли совпадение или нет?

Edit: На следующем рисунке показано, что мой текущий запрос (левое соединение) возвращает:

Test Data

+3

«ЛЕВЫЙ ПРИСОЕДИНЯЙТЕ» должен делать именно то, что вы описываете. Можете ли вы показать некоторые примеры данных того, что это происходит, и что вы хотите? – eggyal

+0

Вы можете предоставить некоторые данные образца? – Nithesh

+0

В результате должен отображаться идентификатор пользователя для Dwight Schrute, но нет. –

ответ

1

Теперь ясно, в чем проблема.

Нет ничего «неправильного» с запросом, за исключением того, что он возвращает несколько выражений (столбцов) с тем же псевдонимом. И один из них переопределяет другого. (Не в терминах возвращаемого результата, все столбцы и строки есть, проблема заключается в том, как ваш PHP-скрипт обрабатывает набор результатов. Если вы ссылаетесь на значения из строки по «ассоциации» (используя имя столбца) , только один из значений столбца получает ссылку

Таким образом, один из способов исправить это, чтобы квалифицировать столбцы в запросе:.

SELECT u.userID 
    , u.blah 
    , a.userID AS a_userID 
    , a.blah AS a_blah 
    FROM users u 
    LEFT 
    JOIN addresses a 
    ON ... 

, что все псевдонимы столбцов являются уникальными Тогда все из них. имена столбцов будут доступны «ассоциацией» на вашем PHP.

1

Используя запрос, при условии, должны дать результат в u.userID столбце независимо от того, если бы он имел соответствующий адрес , Столбец a.userID будет иметь только данные в строках, которые были объединены с адресом.

Вы можете изменить на:

select u.*, a.address from users u left join addresses a on a.userID = u.userID 

Что бы выбрать только соответствующие части address и держать всю u.

+0

Интересно. Это работает, и я отвечу на ваш ответ. Мне просто интересно (как я уверен, другие комментаторы), что вызывает проблему с исходным запросом. Благодаря! –

+0

Я бы принял ваш ответ, но Спенсер дает более подробное объяснение проблемы, что было бы более полезно для людей в будущем с той же проблемой. –

Смежные вопросы