2011-09-10 19 views
5

Tengo dos tablas:MYSQL: diff entre las mesas

  • productos

  • products_tmp

La tabla products_tmp tiene menos campos. Pero todos los campos que están en products_tmp están en productos.

En la importación de los datos que pueblan la mesa products_tmp y después de eso tengo que hacer 3 cosas:

  1. verificación de los nuevos productos en products_tmp que no están en los productos (obtener IDS) (Listo)

  2. controlar las antiguas productos en los productos que no están en products_tmp (identificadores de obtener para su posterior eliminación) (Listo)

  3. cheque por diferencias sobre el resto. Ambas tablas tienen un identificador único de hash de producto.

y necesito para comprobar las diferencias en los campos, titletext, price, photos y category_id. Y obtengo los tmp ids, entonces puedo actualizar la tabla de productos con nuevos valores.

¿Es posible hacer la diferencia solo en mysql?

+0

Perdón por mi ignorancia, no te entiendo del todo. Ya comparas el diff (Paso 1 y 2), ¿qué te impide hacer el tercer paso? – ajreal

+0

Si, por ejemplo, 'products_tmp' contiene un cambio de precio para uno de los productos que ya existen en' products', él quiere poder identificar esos cambios. –

Respuesta

5
  1. verificación de los nuevos productos en products_tmp que no están en los productos (obtener los identificadores) (Listo)

Esto es sencillo ...

SELECT pt.* 
FROM products_tmp pt 
LEFT JOIN products p ON p.product_id = pt.product_id 
WHERE p.product_id IS NULL; 
  1. verificación de los productos viejos en productos que no están en products_tmp (obtener identificadores para su eliminación posterior) (DONE)

A siempre prefieren intercambio de tablas para realizar RIGHT JOINS - preferencia personal ...

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 por las diferencias en el resto. Ambas tablas tienen un identificador único de hash de producto.

Este es un poco más difícil. Suponiendo que usted no quiere hacer una comparación campo por campo, que podría hacer esto ...

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; 

El UNION deben unirse de forma natural los duplicados en una sola fila, así que cualquier cosa con un recuento de 2 basado en tu clave principal debe ser una fila duplicada. Si coloca los resultados de esto en una tabla temporal, puede hacer más consultas para ver cuáles son las diferencias.

+0

genial, se apagará ... pero ¿no sería el problema que la tabla de productos tiene 3 campos más que tmp? –

+0

esta es mi consulta real: product_hash SELECT count (*) cnt FROM (SELECT p.product_hash, p.price, p.title DE z_imports_products p UNION SELECT pt.product_hash, pt.price, pt .title dE pt z_imports_products_tmp ) pD GROUP BY HAVING product_hash cnt> 1; ' y me da ningún resultado, pero tengo al menos una fila con diferente título! –

+0

rayar que ... nvm ... cometió un error ... en realidad está funcionando bastante bien !!! ¡GRACIAS POR SU TIEMPO y RESPUESTA RÁPIDA! –