Cách tốt nhất là tạo một bảng mới chứa các trường chung từ ba bảng khác và thêm chỉ mục vào trường ngày chung. Ba bảng ban đầu phải chứa một khóa ngoại liên kết đến bảng chung. Với thiết kế này, truy vấn trở nên đơn giản:
SELECT *
FROM common_table
ORDER BY "date" DESC
LIMIT 100
Nếu bạn cũng cần dữ liệu từ các bảng cụ thể hơn, bạn có thể sử dụng LEFT JOINs để chọn dữ liệu đó trong cùng một truy vấn.
Nếu bạn không thể thay đổi thiết kế và hiệu suất không phải là vấn đề thì bạn có thể sử dụng UNION ALL để kết hợp các kết quả từ cả ba bảng trước khi sắp xếp:
SELECT * FROM table1
UNION ALL
SELECT * FROM table2
UNION ALL
SELECT * FROM table3
ORDER BY "date" DESC
LIMIT 100
Lưu ý rằng cách trên sẽ chỉ hoạt động nếu tất cả các bảng có cấu trúc giống nhau. Nếu bạn có các trường xuất hiện trong một bảng nhưng không xuất hiện trong các bảng khác thì bạn nên loại bỏ chúng khỏi SELECT hoặc trả về NULL cho cột đó trong các bảng khác. Ví dụ nếu:
-
table1
có các cộta
,b
,c
vàdate
. -
table2
có các cộtb
,c
vàdate
. -
table3
có các cộta
,c
vàdate
.
Sau đó sử dụng cái này:
SELECT a, b, c, "date"
FROM table1
UNION ALL
SELECT NULL AS a, b, c, "date"
FROM table2
UNION ALL
SELECT a, NULL as b, c, "date"
FROM table3
ORDER BY "date" DESC
LIMIT 100