2017-10-03 11 views
5

Tôi có hai tên bảng 'activites' & 'archived_activities'. Tôi chia bảng hoạt động của tôi thành một bản ghi khác. Bảng hoạt động chỉ chứa 200 hoạt động mới nhất của người dùng và bản ghi còn lại được chuyển đến bảng archived_activities. Bây giờ tôi muốn tham gia cả hai bảng chỉ khi các hoạt động bảng trả về null sau đó tôi muốn sử dụng cùng một bù đắp và giới hạn cho archived_activities bảng để lấy hồ sơ tiếp theo. Dưới đây tôi truy vấn của tôi mà không hoạt động tốt.Cách lấy bản ghi từ bảng khác nếu bảng đầu tiên không trả về bản ghi sử dụng UNION trong truy vấn MySQL

SELECT * FROM activities WHERE user_id=87 LIMIT 180,20 
UNION ALL 
SELECT * FROM activities WHERE user_id=87 LIMIT 180,20 

Nhưng truy vấn này hoạt động không ổn.

Bất kỳ trợ giúp nào?

Trả lời

1

Bạn có thể sử dụng NOT EXISTS():

SELECT * FROM activities 
WHERE user_id=87 
LIMIT 180,20 
UNION ALL 
SELECT * FROM archieve_activities 
WHERE NOT EXISTS(SELECT 1 FROM activities 
       WHERE user_id = 87) 
    AND user_id=87 
LIMIT 180,20 
+0

Nhưng điều gì sẽ xảy ra nếu bảng đầu tiên có nói 100 hồ sơ, và 100 do đó cần được lấy từ bảng lưu trữ? –

+0

"chỉ khi bảng hoạt động trở về null sau đó tôi .." Có vẻ như nó không phải là trường hợp .. Hãy chờ OP để bình luận @TimBiegeleisen – sagi

2

Một cách tiếp cận ở đây sẽ làm một liên minh để có được cả hai hồ sơ hiện hành và lưu trữ vào một bảng logic, nhưng ra lệnh cho họ như vậy mà hồ sơ hiện có được ưu tiên cao hơn, nên chúng tồn tại. Tôi chỉ định vị trí 1 cho các bản ghi hiện tại và 2 cho các bản ghi đã lưu trữ. Sau đó, tôi đặt hàng bởi vị trí này và giữ lại 200 hồ sơ.

SELECT col1, col2, ... 
FROM 
(
    SELECT col1, col2, ..., 1 AS position 
    FROM activities 
    WHERE user_id = 87 
    UNION ALL 
    SELECT col1, col2, ..., 2 
    FROM archived_activities 
    WHERE user_id = 87 
) t 
ORDER BY 
    position 
LIMIT 200; 
+0

Có vẻ như một giải pháp tốt hơn so với @RizwanSaleem của tôi – sagi

0

Bạn có thể thử truy vấn này

select * from activities as a 
union all 
select * from archived_activities as b 
where b.user_id not in 
(select r.user_id 
from activities as r) 
Các vấn đề liên quan