13

我有两张桌子。一个用于用户,一个用于帖子。用户表具有以下字段:

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)

并让它自动为每一列使用别名? 或者有没有其他更快/更方便的方法来做到这一点? 或者我可以这样做而不必自己定义任何别名?

谢谢

4

3 回答 3

11

在不定义别名的情况下执行此操作的唯一方法是获取按列位置而不是按列名索引的行:

$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 *但是,无论如何,在生产代码中使用它通常被认为是一个坏主意。您通常不需要所有列,因此只需获取您确实需要的那些。这减少了在获取结果时不必要的带宽浪费。

于 2013-07-18T20:29:10.093 回答
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
于 2013-07-18T05:46:58.227 回答
0

U 可以在不明确的字段后添加相同的限定名(使用 tildas 或逗号)

SELECT 
   users.id `users.id`,
...
   posts.id `posts.id`, 
...
FROM `users`
   LEFT OUTER JOIN `posts` ON (users.id=posts.id)
于 2017-07-08T09:12:16.847 回答