2011-07-22 28 views
15

I không muốn bất kỳ loại JOIN nào tại đây. Tôi đang xây dựng một nguồn cấp dữ liệu RSS của hai bảng bằng cách sử dụng PHP, và tôi muốn chọn tất cả các hàng từ hai bảng, giữ các hàng riêng biệt nhưng phân loại theo một cột created phổ biến.Chọn các hàng riêng biệt từ hai bảng, theo thứ tự ngày

Ví dụ, nếu tôi có một bảng foo:

id  downloads views created 
----------------------------------------------- 
1  12   23  2011-07-22 00:10:16 
2  51   900  2011-07-22 10:11:45 
3  8   80  2011-07-23 04:12:18 

Và một bảng bar:

id  title  body created 
----------------------------------------------- 
1  foo   ogblog 2011-07-21 10:54:07 
3  bar   zip  2011-07-24 10:54:07 
4  zip   bar  2011-07-25 10:54:07 

Tôi muốn chọn tất cả dữ liệu từ hai bảng lệnh của created cột chung, vì vậy một ví dụ kết quả sẽ là (bỏ qua bar.id vì nó không cần thiết):

id  title  body  downloads views created    | table 
------------------------------------------------------------------------------- 
NULL bar   zip   NULL  NULL 2011-07-24 10:54:07 | bar 
NULL foo   ogblog  NULL  NULL 2011-07-21 10:54:07 | bar 
1  NULL  NULL  12   23  2011-07-22 00:10:16 | foo 
2  NULL  NULL  51   900  2011-07-22 10:11:45 | foo 
3  NULL  NULL  8   80  2011-07-23 04:12:18 | foo 
NULL zip   bar   NULL  NULL 2011-07-25 10:54:07 | bar 

Cột table là không cần thiết; Tôi đã thêm nó để làm cho mọi thứ dễ hiểu hơn một chút.

Hy vọng đó là điều tôi muốn làm; thay vì thực hiện một JOIN trong đó một hàng được tạo từ các cột từ hai bảng, tôi muốn lấy tất cả dữ liệu hàng với bố cục cột chung, trong đó bất kỳ cột nào không tồn tại trong bảng có đặt NULL.

Vui lòng cho tôi biết nếu bạn cần làm rõ.

+0

'UNION ALL' giống như những gì bạn cần (với các cột giả để tính toán sự khác biệt về cấu trúc) –

Trả lời

22

Sử dụng cột giả vào tài khoản cho các cấu trúc khác nhau, một công đoàn tham gia cùng họ và cha mẹ chọn để xử lý thứ tự:

SELECT * FROM (
    (SELECT foo.id, NULL AS title, NULL AS body, foo.downloads, foo.views, foo.created FROM foo) 
    UNION ALL 
    (SELECT NULL AS id, bar.title, bar.body, NULL AS downloads, NULL AS views, bar.created FROM bar) 
) results 
ORDER BY created ASC 
+0

Cảm ơn rất nhiều Brendan - điều này làm việc tốt. – Bojangles

13

Mở rộng trên gợi ý @Brendan Bullen của, đây là một ví dụ sử dụng UNION ALL nên hoạt động cho bạn:

SELECT id as id, NULL as title, NULL as body, downloads as downloads, 
    views as views, created as created, 'foo' as table_name 
FROM foo 
UNION ALL 
SELECT NULL as id, title as title, body as body, NULL as downloads, 
    NULL as views, created as created, 'bar' as table_name 
FROM bar 
ORDER BY created ASC 
+0

Đã đến đó trước tôi với truy vấn thực tế! :) Cái gì đó luôn luôn confuses tôi với công đoàn, hiện rằng 'ORDER BY' áp dụng cho các kết quả như một toàn bộ hoặc chỉ có các lựa chọn thứ hai tuyên bố? tức là như trong câu trả lời của tôi, có bất kỳ điểm nào trong việc tách nó ra không? –

+0

@Brendan, 'ORDER BY' áp dụng cho kết quả của UNION, vì vậy không cần sử dụng phụ chọn. –

+0

Ngoài ra, tôi đã có một số lỗi chính tả trong truy vấn ban đầu của mình. Tôi đã sửa chúng ngay bây giờ. –

Các vấn đề liên quan