5

Supongamos que tenemos la tabla de MySQL que describe si se puede mezclar dos sustancias¿Hay un atajo para normalizar una tabla donde las columnas = filas?

Product A B C 
--------------------- 
A   y n y 
B   n y y 
C   y y y 

El primer paso sería transformarlo como

P1 P2 ? 
----------- 
A A y 
A B n 
A C y 
B A y 
B B y 
B C n 
C A y 
C B n 
C C y 

Pero entonces usted tiene información duplicada. (Por ejemplo. Si A puede mezclar con B, entonces B puede mezclar con A), por lo que, puede eliminar varias filas para obtener

P1 P2 ? 
----------- 
A A y 
A B n 
A C y 
B B y 
B C n 
C C y 

Mientras que el último paso fue bastante fácil con una pequeña mesa, hacerlo manualmente sería toma para siempre en una mesa más grande. ¿Cómo se puede automatizar la eliminación de filas con SIGNIFICADO duplicado, pero no contenido idéntico?

Gracias, espero que mi pregunta tiene sentido ya que todavía estoy aprendiendo las bases de datos

+1

'A A y',' B B y' etc parece bastante obvio. ¿Por qué no genera la tabla correctamente, desde el principio? Solo toma uno de los triángulos, excluyendo la diagonal. – mvds

Respuesta

4

Si es seguro asumir que usted está comenzando con todas las relaciones se duplicaron hasta, por ejemplo,

Si A B está en la tabla, entonces B A está garantizado en la tabla.

Entonces todo lo que tiene que hacer es eliminar todas las filas donde P2 < P1;

DELETE FROM `table_name` WHERE `P2` < `P1`; 

Si este no es el caso, puede que sea el caso pasando a través de la mesa y la inserción de todas las filas duplicadas si no existen ya, a continuación, ejecutar esto.

+0

Me alegra que haya encontrado útil mi respuesta, pero recomendaría esperar más tiempo para recibir respuestas antes de aceptarla. Es muy posible que haya una solución mucho mejor que esto, o que haya un error crítico en el mío. –

+0

buen punto. esperaré. – thomas

+0

buena respuesta, siempre que la suposición de que todas las relaciones se dupliquen sea verdadera. Sin embargo, si no puede estar seguro de que la suposición se mantendrá, debe verificar si hay duplicados antes de eliminarlos. – dave

1

Paso 1 (como se ha hecho ya): Transformar a la Tabla2

P1 P2 ? 
----------- 
A A y 
A B n 
A C y 
B A y 
B B y 
B C n 
C A y 
C B n 
C C y 

Paso 2: Columnas reordenar, select distinct

SELECT DISTINCT 
    IF P1<P2 THEN P1 ELSE P2 END as P1, -- this puts the smallest value in P1 
    IF P1>P2 THEN P1 ELSE P2 END as P2 -- this puts the largest value in P2 
FROM Table2 
WHERE NOT P1=P2 --(Assuming records like A, A, y are not interesting) 

Yo no soy un tipo MySQL, por lo que podría necesitar verificar la sintaxis if/then, pero esto parece conceptualmente bien de todos modos.

+0

por cierto, tal vez esto es solo una tarea, pero en cuanto a una preocupación del mundo real, podría considerar mezclas con más de 2 partes. Por ejemplo, podría estar bien mezclar A con B; y bien para mezclar B con C; pero mezclar los tres A, B y C juntos podría ser algo que quieras evitar. – dave

+0

Lo haré y gracias. (pasantía) – thomas

2

No creo que sea necesario en su caso, pero como ejercicio intelectual, podría basarse en la solución de Jamie Wong y evitar que las columnas no duplicadas se eliminen con una cláusula EXISTS. Algo como esto:

DELETE FROM `table_name` AS t1 
    WHERE `P2` < `P1` 
    AND EXISTS (SELECT NULL FROM `table_name` AS t2 
     WHERE t1.`P1` = t2.`P2` AND t1.`P2` = t2.`P1`); 

Basta con asegurarse de que haya un duplicado antes de eliminar algo.

(Mi sintaxis de MySQL puede ser un poco fuera, sino que ha pasado un tiempo.)

+0

buen punto. Si usa el método de eliminación, debe verificar si hay duplicados antes de eliminarlos. Sin embargo, puede evitar eliminar y la verificación duplicada por completo (vea mi respuesta más arriba). – dave

+0

@dave Probablemente no debería decir "arriba". A menos que esté seguro de que recibirá más votos positivos: P –

+0

Lo tendré en cuenta. Gracias – thomas

Cuestiones relacionadas