13

私は2つのテーブルを持っています。1 つはユーザー用、もう 1 つは投稿用です。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によって上書きされます。idcreated_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)

または似たようなものですが、同じ名前の2つの列を区別したいたびに、すべての列の名前またはエイリアスを手動で書き出さずにこれを行う方法があるかどうか疑問に思っていましたか? 次のようなことは可能ですか:

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

そして、すべての列に自動的にエイリアスを使用しますか? または、これを行うための他のより高速で便利な方法はありますか? または、エイリアスを自分で定義せずにこれを行うことはできますか?

ありがとうございました

4

3 に答える 3