2011-09-10 9 views
5

Mam dwie tabele:MySQL: diff między tabelami

  • produkty

  • products_tmp

tabela products_tmp ma mniej pól. Ale wszystkie pola, które są w products_tmp są w produktach.

na import danych I wypełnić tabelę products_tmp a potem muszę zrobić 3 rzeczy:

  1. sprawdzić nowe produkty w products_tmp, które nie są produktami (GET IDS) (zrobione)

  2. sprawdzić starych produktów w produktach, które nie są w products_tmp (identyfikatory dostać do późniejszego usunięcia) (zrobione)

  3. sprawdzenie różnic w stanie spoczynku. Obie tabele mają unikatowy identyfikator produktu.

I muszę sprawdzić różnice w dziedzinach title, text, price, photos i category_id. I uzyskanie identyfikatorów tmp, dzięki czemu mogę zaktualizować tabelę produktów o nowe wartości.

Czy można to zrobić tylko w mysql?

+0

Wybaczcie moją ignorancję, nie bardzo was rozumiem. Porównujesz już różnicę (Krok 1 i 2), co powstrzymuje cię od wykonania trzeciego kroku? – ajreal

+0

Jeśli na przykład słowo "products_tmp" zawiera zmianę ceny jednego z produktów, które już istnieją w "produktach", chce je zidentyfikować. –

Odpowiedz

5
  1. sprawdzić nowe produkty w products_tmp, które nie są produktami (get IDS) (zrobione)

To proste ...

SELECT pt.* 
FROM products_tmp pt 
LEFT JOIN products p ON p.product_id = pt.product_id 
WHERE p.product_id IS NULL; 
  1. wyboru stare produkty w produktach, których nie ma w products_tmp (pobierz identyfikator do późniejszego usunięcia) (WYKONANE)

zawsze wolą ciężkich stołów do wykonywania RIGHT JOINS - osobiste preferencje ...

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

3.Sprawdź dla różnic na odpoczynek. Obie tabele mają unikatowy identyfikator produktu.

Ten jest nieco trudniejszy. Zakładając, że nie chce zrobić porównanie pole po polu, można to zrobić ...

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; 

UNION powinny naturalnie połączyć duplikaty razem w jednym rzędzie, więc nic o liczbie 2 na podstawie klucza podstawowego powinien być duplikatem wiersza. Jeśli umieścisz wyniki tego w tabeli tymczasowej, możesz zrobić więcej zapytań, aby zobaczyć, jakie są różnice.

+0

fajnie, zrób to ... ale czy nie byłoby problemu, że tabela produktów ma 3 dodatkowe pola niż tmp? –

+0

to mój rzeczywisty zapytania: SELECT product_hash, count (*) FROM (CNT SELECT p.product_hash, p.price, p.title Z z_imports_products p UNION SELECT pt.product_hash , pt.price, PT .title OD z_imports_products_tmp pt ) pD GROUP BY product_hash BIORĄC cnt> 1; ' i uzyskać żadnych wyników, ale mam przynajmniej jeden wiersz z innego tytułu! –

+0

zdrap, że ... nvm ... popełnił błąd ... w rzeczywistości działa całkiem dobrze !!! DZIĘKI ZA CZAS I SZYBKĄ ODPOWIEDŹ! –

Powiązane problemy