2013-07-18 38 views
12

Tôi có hai bảng. Một cho người dùng và một cho bài đăng. Bảng người dùng có các lĩnh vực sau:PHP/MySQL: Bắt nhiều cột có cùng tên trong truy vấn tham gia không có bí danh?

id, username, password, created_at, modified_at 

Bảng viết có các lĩnh vực sau:

id, user_id, title, body, created_at, modified_at 

Khi tôi sử dụng một truy vấn như:

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

Và lấy kết quả sử dụng PDO:

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

Mảng được trả về ghi đè tất cả các cột với tên giống như id, created_at, modified_at như thế này:

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... 
     ) 
) 

Các id lĩnh vực cho người sử dụng không được hiển thị, thay vì ghi đè bởi id của bưu điện. Tương tự cho các trường created_at & modified_at.

Tôi tin rằng tôi có thể giải quyết vấn đề này bằng cách sử dụng bí danh hoặc một cái gì đó như thế này:

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) 

Hoặc một cái gì đó tương tự, nhưng tôi đã tự hỏi nếu có một cách để làm điều này mà không tự viết ra tên của mỗi cột đơn hoặc bí danh cho mỗi lần tôi muốn phân biệt giữa hai cột cùng tên? Có thể làm điều gì đó như:

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

Và có nó tự động sử dụng bí danh cho mỗi cột? Hoặc có cách nào khác nhanh hơn/thuận tiện hơn để thực hiện việc này không? Hoặc tôi có thể thực hiện việc này mà không phải tự định nghĩa bất kỳ bí danh nào không?

Cảm ơn bạn

Trả lời

4

Tôi nghĩ bí danh là hoàn hảo trong trường hợp này

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

Để giúp bạn tiết kiệm một số thời gian đánh máy, bí danh bảng sử dụng:

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

Cảm ơn bạn đã trả lời của bạn! Tôi đã tự hỏi mặc dù có một cách để làm điều này mà không cần xác định bí danh? – randomphp

+4

Tôi không chắc tại sao điều này được đánh dấu là câu trả lời được chấp nhận, nó cung cấp một giải pháp đã được đề cập trong câu hỏi, và câu hỏi đã được yêu cầu cụ thể cho một giải pháp _different_. Câu trả lời của Bill Karwin là hữu ích hơn nhiều. – Niall

7

Cách duy nhất để làm điều này mà không xác định bí danh là tìm nạp các hàng được lập chỉ mục theo vị trí cột thay vì theo tên cột:

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

Bạn cũng có thể giảm bớt công việc để cột bí danh bằng răng cưa chỉ có các cột cần nó:

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

Tuy nhiên, nó thường được coi là một ý tưởng tồi để sử dụng SELECT * trong mã sản xuất anyway. Thông thường, bạn không cần tất cả các cột, vì vậy, chỉ cần tìm những cột mà bạn cần. Điều này làm giảm lãng phí không cần thiết của băng thông khi bạn lấy kết quả.

0

U có thể thêm tên có trình độ tương tự sau khi lĩnh vực nhập nhằng (tildas sử dụng hoặc dấu phẩy)

SELECT 
    users.id `users.id`, 
... 
    posts.id `posts.id`, 
... 
FROM `users` 
    LEFT OUTER JOIN `posts` ON (users.id=posts.id) 
Các vấn đề liên quan