PHP/MySQL:在没有别名的连接查询中获取具有相同名称的多列?

ran*_*php 13 php mysql pdo join duplicates

我有两张桌子.一个用户,一个用于帖子.users表包含以下字段:

id, username, password, created_at, modified_at
Run Code Online (Sandbox Code Playgroud)

posts表包含以下字段:

id, user_id, title, body, created_at, modified_at
Run Code Online (Sandbox Code Playgroud)

当我使用如下查询时:

SELECT * FROM `users` LEFT OUTER JOIN `posts` ON users.id=posts.user_id
Run Code Online (Sandbox Code Playgroud)

并使用PDO获取结果:

$sth = $this->$default_connection->prepare($query);
$sth->execute();
$sth->fetchAll(PDO::FETCH_ASSOC);
Run Code Online (Sandbox Code Playgroud)

返回的数组将覆盖具有相同名称的所有列,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...
        )
)
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)

或类似的东西,但我想知道是否有一种方法可以做到这一点,而无需手动写出每个列的名称或别名每次我想区分两个同名的列?有可能做这样的事情:

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

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

谢谢

Bil*_*win 9

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

$sth->fetchAll(PDO::FETCH_NUM);
Run Code Online (Sandbox Code Playgroud)

您还可以通过仅对需要它的列进行别名来减少别名列的工作:

SELECT *, posts.created_at AS postCreatedAt, posts.updated_at AS postUpdatedAt
FROM `users` LEFT OUTER JOIN `posts` ON users.id=posts.user_id
Run Code Online (Sandbox Code Playgroud)

但是,SELECT *无论如何,通常认为在生产代码中使用它是个坏主意.您通常不需要所有列,因此只需获取您需要的列.这样可以在获取结果时减少不必要的带宽浪费.


Nap*_*ter 4

我认为在这种情况下别名是完美的

SELECT table1.column AS column1, table2.column AS column2
FROM table1
LEFT JOIN table2
ON table1.column = table2.column
Run Code Online (Sandbox Code Playgroud)

为了节省您的打字时间,请使用表别名:

SELECT t1.column AS column1, t2.column AS column2
FROM table1 AS t1
LEFT JOIN table2 AS t2
ON t1.column = t2.column
Run Code Online (Sandbox Code Playgroud)

  • 我不确定为什么这被标记为已接受的答案,它提供了问题中已经提到的解决方案,并且该问题专门要求_不同_解决方案。比尔·卡文(Bill Karwin)的回答更有帮助。 (4认同)