我有两张桌子。一个用户,一个用于帖子。 users表包含以下字段:
id, username, password, created_at, modified_at
posts表格包含以下字段:
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)
让它自动为每列使用别名吗? 或者还有其他更快/更方便的方法吗? 或者我可以自己定义任何别名吗?
谢谢
答案 0 :(得分:9)
在不定义别名的情况下执行此操作的唯一方法是获取按列位置而不是按列名索引的行:
$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 *
通常被认为是个坏主意。您通常不需要所有列,因此只需获取您需要的列。这样可以在您获取结果时减少不必要的带宽浪费。
答案 1 :(得分:4)
我认为在这种情况下别名是完美的
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 :(得分:0)
你可以在不明确的字段后面添加相同的限定名称(使用tildas或逗号)
SELECT
users.id `users.id`,
...
posts.id `posts.id`,
...
FROM `users`
LEFT OUTER JOIN `posts` ON (users.id=posts.id)