2013-04-07 48 views
5

Tôi biết các truy vấn kết hợp phải có cùng số cột. Tôi đang cố gắng lấy kết quả từ bảng comments và kết quả từ bảng strings, có nhiều kết nối. Làm thế nào để tôi điều này một cách chính xác? Tôi chưa thử nghiệm vì tôi biết tôi sẽ gặp lỗi với số cột khác nhau. Dưới đây là hai truy vấn mà tôi đang cố gắng kết hợp.mysql union số cột khác nhau

truy vấn 1 (chuỗi)

SELECT sub.actionid as usersub, 
       ftable.`last-time` as lastvisited, updatetable.recent as mostrecent, parent.* FROM `strings` as parent 
     LEFT JOIN subscribe sub on sub.actionid=parent.id AND sub.userid=:userid 
     JOIN followers ftable on ((ftable.sid=parent.sid AND ftable.page='1') OR 
     (ftable.sid=parent.sid AND ftable.position=parent.position AND ftable.page='0') 
     OR (ftable.profile=parent.starter AND parent.guideline='1')) AND ftable.userid=:userid 
     JOIN `update-recent` updatetable on 
     ((updatetable.sid=parent.sid AND updatetable.position=parent.position AND updatetable.pageid='0') 
     OR (updatetable.profile=parent.starter) OR (updatetable.pageid=parent.pageid AND parent.pageid!=0)) 
     WHERE ftable.userid=:userid AND parent.deleted='0' GROUP BY parent.id 

truy vấn 2 (bình luận)

SELECT * FROM comments WHERE viewed='0' AND (`starter-id`=:userid OR respondid=:userid) 

Tôi muốn đặt hàng các kết quả theo cột timestamp posted (gần đây nhất) ORDER BY posted DESC

Làm cách nào để kết hợp các truy vấn này?

+0

Không có chức năng tổng hợp trong truy vấn của bạn, vậy điểm của GROUP BY là gì? – Strawberry

+0

có thể trùng lặp của [Liên kết hai bảng với số cột khác nhau] (http://stackoverflow.com/questions/2309943/unioning-two-tables-with-different-number-of-columns) – hakre

Trả lời

17

Bạn muốn chọn các cột là NULL để chiếm không gian trống trong một số bảng nhất định.

Bảng A: (id, column1)

Bảng B: (id, column1, column2)

Select id, column1, null as column2 from tableA 
UNION 
Select id, column1, column2 from tableB 
1

Thêm cột trống (null as columnName) vào truy vấn có ít cột hơn. Bạn nên tránh sử dụng * trong trường hợp này, để kiểm soát tốt hơn thứ tự các cột trong cả hai truy vấn.

1

Một cách rất tinh ranh để có được xung quanh vấn đề này là để CONCAT_WS cột không được chia sẻ giữa bảng ví dụ

SELECT `r_id`, `r_added`, CONCAT_WS('###',`otherfield1`,`otherfield2`) as r_other FROM table1 
UNION 
SELECT `r_id`, `r_added`, CONCAT_WS('###',`otherfield3`,`otherfield4`,`otherfield5`) as r_other FROM table2 

Sau đó, bạn có thể tạo lại dữ liệu đó theo cách lập trình, ví dụ:

$rother = explode("###", $row['r_other']); 

cách Rất xấu để có được dữ liệu này nhưng có thể nhận được một người nào đó ra khỏi một sửa chữa. Bạn thậm chí có thể thay đổi dấu phân cách, ví dụ: # t1 # # t2 # tìm kiếm chuỗi đó để tập hợp bảng dữ liệu được nối là gì.

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