Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

[SOLUCIONADO] Ordenar la unión total de dos tablas y diferentes campos

Estas en el tema de Ordenar la unión total de dos tablas y diferentes campos en el foro de Mysql en Foros del Web. Muy buenas a todos, aunque me habéis resuelto muchas dudas sin vosotros saberlo, esta vez no he podido dar con la solución. Tengo dos tablas: ...
  #1 (permalink)  
Antiguo 04/02/2014, 04:53
srpiramo
Invitado
 
Mensajes: n/a
Puntos:
Ordenar la unión total de dos tablas y diferentes campos

Muy buenas a todos, aunque me habéis resuelto muchas dudas sin vosotros saberlo, esta vez no he podido dar con la solución.

Tengo dos tablas:

Código MySQL:
Ver original
  1. tabla1                          tabla2
  2. -------------------------       -------------------------------------------------------
  3. | uno_id | uno_nombre   |       | dos_id | dos_nombre   | dos_empresa  | dos_cargo    |
  4. -------------------------       -------------------------------------------------------
  5. |      1 | Marcial      |       |      1 | Marcial      | Mercado      | Gerente      |
  6. |      3 | Alfredo      |       |      2 | Carlos       | Zapatería    | Peón         |
  7. -------------------------       -------------------------------------------------------

Las he unido por completo, como mysql no acepta FULL OUTER JOIN las he unido así:

Código MySQL:
Ver original
  1.    tabla1.uno_id,
  2.    tabla1.uno_nombre,
  3.    tabla2.dos_id,
  4.    tabla2.dos_nombre,
  5.    tabla2.dos_empresa,
  6.    tabla2.dos_cargo
  7. FROM tabla1
  8.    LEFT JOIN tabla2
  9.    ON tabla1.uno_id = tabla2.dos_id)
  10. (SELECT   tabla1.uno_id,
  11.    tabla1.uno_nombre,
  12.    tabla2.dos_id,
  13.    tabla2.dos_nombre,
  14.    tabla2.dos_empresa,
  15.    tabla2.dos_cargo
  16. FROM tabla1
  17.    RIGHT JOIN tabla2
  18.    ON tabla1.uno_id = tabla2.dos_id)

El resultado es el siguiente:
Código MySQL:
Ver original
  1. --------------------------------------------------------------------------------
  2. | uno_id | uno_nombre   | dos_id | dos_nombre   | dos_empresa  | dos_cargo    |
  3. -------------------------------------------------------------------------------
  4. |      1 | Marcial      |      1 | Marcial      | Mercado      | Gerente      |
  5. |      3 | Alfredo      |   NULL |         NULL |         NULL |         NULL |
  6. |   NULL |         NULL |      2 | Carlos       | Zapatería    | Peón         |
  7. -------------------------------------------------------------------------------

El problema viene porque la tabla1 no la puede modificar el usuario de la aplicación, y la tabla2 complementa, por así decirlo, a la tabla1. De esta manera manera el usuario puede encontrar las diferencias entre ambas tablas y modificar la tabla2 si quiere.

Funciona bien, pero me gustaría ordenarlo con una mezcla de uno_id y dos_id para que quedara así:

Código MySQL:
Ver original
  1. --------------------------------------------------------------------------------
  2. | uno_id | uno_nombre   | dos_id | dos_nombre   | dos_empresa  | dos_cargo    |
  3. -------------------------------------------------------------------------------
  4. |      1 | Marcial      |      1 | Marcial      | Mercado      | Gerente      |
  5. |   NULL |         NULL |      2 | Carlos       | Zapatería    | Peón         |
  6. |      3 | Alfredo      |   NULL |         NULL |         NULL |         NULL |
  7. -------------------------------------------------------------------------------

Y es que no sé ni siquiera cómo empezar a hacer ese ORDER BY, estoy en blanco.
Desde ya muchas gracias
  #2 (permalink)  
Antiguo 04/02/2014, 11:25
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: Ordenar la unión total de dos tablas y diferentes campos

Hola srpiramo:

Si entendí correctamente lo que quieres hacer es ordenar por el campo uno_id, siempre y cuando el valor sea distinto de nulo, pero en caso de que sea nulo, entonces ordenar por el campo dos_id... Esto quiere decir que primero debes determinar si el campo uno_id es nulo o no y hacer una ordenación condicional.

La consulta podría quedar así:

Código MySQL:
Ver original
  1. mysql> SELECT
  2.     ->    tabla1.uno_id,
  3.     ->    tabla1.uno_nombre,
  4.     ->    tabla2.dos_id,
  5.     ->    tabla2.dos_nombre,
  6.     ->    tabla2.dos_empresa,
  7.     ->    tabla2.dos_cargo
  8.     -> FROM tabla1
  9.     ->    LEFT JOIN tabla2 ON tabla1.uno_id = tabla2.dos_id
  10.     -> UNION
  11.     -> SELECT
  12.     ->    tabla1.uno_id,
  13.     ->    tabla1.uno_nombre,
  14.     ->    tabla2.dos_id,
  15.     ->    tabla2.dos_nombre,
  16.     ->    tabla2.dos_empresa,
  17.     ->    tabla2.dos_cargo
  18.     -> FROM tabla1
  19.     ->    RIGHT JOIN tabla2
  20.     ->    ON tabla1.uno_id = tabla2.dos_id
  21.     -> ORDER BY IF (uno_id IS NOT NULL, uno_id, dos_id);
  22. +--------+------------+--------+------------+-------------+-----------+
  23. | uno_id | uno_nombre | dos_id | dos_nombre | dos_empresa | dos_cargo |
  24. +--------+------------+--------+------------+-------------+-----------+
  25. |      1 | Marcial    |      1 | Marcial    | Mercado     | Gerente   |
  26. |   NULL | NULL       |      2 | Carlos     | Zapateria   | Peon      |
  27. |      3 | Alfredo    |   NULL | NULL       | NULL        | NULL      |
  28. +--------+------------+--------+------------+-------------+-----------+
  29. 3 rows in set (0.00 sec)

Observa que al poner un IF en el ORDER BY se realiza una pregunta antes de ordenar... Quizás quede más claro si observas cómo trabaja el IF cuando se pone en el SELECT:

Código MySQL:
Ver original
  1. mysql> SELECT
  2.     ->    tabla1.uno_id,
  3.     ->    tabla2.dos_id,
  4.     ->    IF(tabla1.uno_id IS NOT NULL, tabla1.uno_id, tabla2.dos_id) orden
  5.     -> FROM tabla1
  6.     ->    LEFT JOIN tabla2 ON tabla1.uno_id = tabla2.dos_id
  7.     -> UNION
  8.     -> SELECT
  9.     ->    tabla1.uno_id,
  10.     ->    tabla2.dos_id,
  11.     ->    IF(tabla1.uno_id IS NOT NULL, tabla1.uno_id, tabla2.dos_id) orden
  12.     -> FROM tabla1
  13.     ->    RIGHT JOIN tabla2
  14.     ->    ON tabla1.uno_id = tabla2.dos_id
  15.     -> ORDER BY orden;
  16. +--------+--------+-------+
  17. | uno_id | dos_id | orden |
  18. +--------+--------+-------+
  19. |      1 |      1 |     1 |
  20. |   NULL |      2 |     2 |
  21. |      3 |   NULL |     3 |
  22. +--------+--------+-------+
  23. 3 rows in set (0.00 sec)

Observa que el campo calculado ORDEN va tomando el id correspondiente de acuerdo a la condición que colocas en el IF... Dale un vistazo para ver si esto es lo que necesitas.

Saludos
Leo
  #3 (permalink)  
Antiguo 04/02/2014, 13:23
srpiramo
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Ordenar la unión total de dos tablas y diferentes campos

Funciona perfecto. Un millón de gracias.

A estudiar las funciones de control de flujo

http://dev.mysql.com/doc/refman/5.5/en/control-flow-functions.html

Última edición por srpiramo; 04/02/2014 a las 13:29

Etiquetas: campos, join, null, select, sql, tabla, tablas
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 17:36.