PHP/MySQL: получение нескольких столбцов с одинаковым именем в объединении запросов без псевдонимов?

У меня две таблицы. Один для пользователей и один для сообщений. Таблица пользователей имеет следующие поля:

id, username, password, created_at, modified_at

Таблица сообщений имеет следующие поля:

id, user_id, title, body, created_at, modified_at

Когда я использую такой запрос, как:

SELECT * FROM `users` LEFT OUTER JOIN `posts` ON users.id=posts.user_id

И получить результаты с помощью PDO:

$sth = $this->$default_connection->prepare($query);
$sth->execute();
$sth->fetchAll(PDO::FETCH_ASSOC);

Возвращаемый массив перезаписывает все столбцы с теми же именами, что и id, created_at, modified_at следующим образом:

 Array
(
    [0] => Array
        (
            [id] => 1
            [username] => johnSmith
            [password] => 2348r7edf8s79aa0230
            [created_at] => 0000-00-00 00:00:00
            [modified_at] => 0000-00-00 00:00:00
            [user_id] => 18
            [title] => First Post
            [body] => Just testing...
        )
)

Поле id для пользователя не отображается, вместо этого перезаписывается id сообщения. То же самое касается полей created_at и modified_at.

Я считаю, что могу решить эту проблему, используя либо псевдонимы, либо что-то вроде этого:

    SELECT 
       users.id, 
       users.username, 
       users.password, 
       users.created_at, 
       users.modified_at, 
       posts.id AS postId, 
       posts.user_id, 
       posts.title, 
       posts.created_at AS postCreatedAt, 
       posts.modified_at AS postModifiedAt
   FROM `users`
       LEFT OUTER JOIN `posts` ON (users.id=postId)

Или что-то подобное, но мне было интересно, есть ли способ сделать это без ручного ввода имени каждого отдельного столбца или псевдонима для каждого раза, когда я хочу различать два столбца с тем же именем? Можно ли сделать что-то вроде:

SELECT users.* AS User and posts.* AS Post from `users` LEFT OUTER JOIN ON (User.id=Post.user_id)

И автоматически ли он использует псевдонимы для каждого столбца? Или есть какой-нибудь другой более быстрый/более удобный способ сделать это? Или я могу это сделать без необходимости определять какие-либо псевдонимы?

Спасибо

Ответ 1

Я думаю, что псевдоним в этом случае идеален

SELECT table1.column AS column1, table2.column AS column2
FROM table1
LEFT JOIN table2
ON table1.column = table2.column

Чтобы сэкономить время ввода, используйте псевдонимы таблиц:

SELECT t1.column AS column1, t2.column AS column2
FROM table1 AS t1
LEFT JOIN table2 AS t2
ON t1.column = t2.column

Ответ 2

Единственный способ сделать это без определения псевдонимов - выбор строк, индексированных по столбцам, вместо имени столбца:

$sth->fetchAll(PDO::FETCH_NUM);

Вы также можете уменьшить работу в столбцах псевдонимов, наложив только те столбцы, которые в ней нуждаются:

SELECT *, posts.created_at AS postCreatedAt, posts.updated_at AS postUpdatedAt
FROM `users` LEFT OUTER JOIN `posts` ON users.id=posts.user_id

Однако, как правило, считается, что плохая идея использовать SELECT * в производственном коде. Обычно вам не нужны все столбцы, поэтому просто загружайте те, которые вам нужны. Это уменьшает ненужную трату полосы пропускания при получении результатов.

Ответ 3

U может добавлять такое же квалифицированное имя после неоднозначных полей (использовать тильды или запятые)

SELECT 
   users.id `users.id`,
...
   posts.id `posts.id`, 
...
FROM `users`
   LEFT OUTER JOIN `posts` ON (users.id=posts.id)