2011-09-10 27 views
5

Tôi có hai bảng:MYSQL: diff giữa bảng

  • sản phẩm

  • products_tmp

Bảng products_tmp có các trường ít hơn. Nhưng tất cả các trường trong products_tmp đều có trong sản phẩm.

Mở nhập khẩu dữ liệu tôi cư bảng products_tmp và sau đó tôi cần phải làm 3 điều:

  1. kiểm tra các sản phẩm mới trong products_tmp mà không phải là trong các sản phẩm (có id) (DONE)

  2. kiểm tra các sản phẩm cũ trong các sản phẩm không nằm trong products_tmp (lấy id để xóa sau) (DONE)

  3. kiểm tra sự khác biệt trên phần còn lại. Cả hai bảng đều có mã định danh duy nhất băm sản phẩm.

Và tôi cần phải kiểm tra sự khác biệt trong các lĩnh vực title, text, price, photoscategory_id. Và nhận được id tmp, vì vậy tôi có thể cập nhật bảng sản phẩm với các giá trị mới.

Chỉ có thể thực hiện khác biệt trong mysql?

+0

Xin lỗi vì sự thiếu hiểu biết của tôi, tôi không hiểu rõ bạn. Bạn đã so sánh sự khác biệt (Bước 1 & 2), điều gì khiến bạn không thực hiện bước thứ ba? – ajreal

+0

Ví dụ: 'products_tmp' chứa thay đổi giá cho một trong các sản phẩm đã tồn tại trong 'sản phẩm', anh ấy muốn có thể xác định những thay đổi đó. –

Trả lời

5
  1. kiểm tra các sản phẩm mới trong products_tmp mà không phải là trong các sản phẩm (có id) (DONE)

Đây là thẳng về phía trước ...

SELECT pt.* 
FROM products_tmp pt 
LEFT JOIN products p ON p.product_id = pt.product_id 
WHERE p.product_id IS NULL; 
  1. kiểm tra các sản phẩm cũ trong các sản phẩm không có trong products_tmp (lấy id để xóa sau này) (DONE)

Một luôn thích trao đổi bảng để thực hiện RIGHT JOINS - sở thích cá nhân ...

SELECT p.* 
FROM products p 
LEFT JOIN products_tmp pt ON p.product_id = pt.product_id 
WHERE pt.product_id IS NULL; 

3.check cho sự khác biệt trên phần còn lại. Cả hai bảng đều có mã định danh duy nhất băm sản phẩm.

Cái này khó hơn một chút. Giả sử bạn không muốn làm một so sánh lĩnh vực-by-lĩnh vực, bạn có thể làm điều này ...

SELECT product_id, count(*) cnt 
FROM (
    SELECT p.product_id, p.field2, p.field3 
    FROM products p 
    UNION 
    SELECT pt.product_id, pt.field2, pt.field3 
    FROM products_tmp pt 
) pd 
GROUP BY product_id 
HAVING cnt > 1; 

Các UNION tự nhiên nên tham gia các bản sao lại với nhau thành một hàng duy nhất, vì vậy bất cứ điều gì với một số của 2 dựa trên khóa chính của bạn phải là một hàng trùng lặp. Nếu bạn đặt kết quả này vào bảng tạm thời, bạn có thể thực hiện thêm các truy vấn để xem sự khác biệt là gì.

+0

mát mẻ, sẽ chek nó ra ... nhưng sẽ không phải là vấn đề mà bảng sản phẩm có 3 lĩnh vực nhiều hơn tmp? –

+0

này là truy vấn thực tế của tôi: CHỌN product_hash, count (*) cnt TỪ ( p.product_hash SELECT, p.price, p.title TỪ p z_imports_products UNION CHỌN pt.product_hash, pt.price, pt .title TỪ z_imports_products_tmp pt ) pd GROUP BY product_hash HAVING cnt> 1; ' và tôi không có kết quả, nhưng tôi có ít nhất một hàng có tiêu đề khác! –

+0

xước ... nvm ... đã phạm sai lầm ... nó thực sự hoạt động khá tốt !!! THANKS CHO THỜI GIAN CỦA BẠN VÀ NHANH CHÓNG! –