SQL - Ayuda con Consulta

   
Vista:

Ayuda con Consulta

Publicado por José Maria (7 intervenciones) el 02/03/2018 11:59:11
Buenas gente,

Tengo una Base de datos con la siguiente estructura:

Una tabla principal T_Expediente que tiene un Id_Expediente y un N_Expediente, luego tengo varias tablas con las conversaciones sobre ese expediente.
Estas tablas son Conversacion_Aseguradora,Conversacion_Trabajadores,etc...
Las conversaciones tienen un campo Expediente que es el que se relaciona con la tabla principal.

Dicho esto lo que quiero es que me muetre un historial de esas conversaciones.
Para ello he relacionado el campo Id_Expediente con el campo Expediente que tiene cada conversación y he hecho esta consulta:

SELECT dbo_T_Expediente.N_Expediente, dbo_Conversacion_Aseguradora.Conversacion, dbo_Conversacion_Trabajadores.Conversacion, dbo_Conversacion_Peritos.Conversacion, dbo_Conversacion_Asegurados.Conversacion
FROM (((dbo_T_Expediente INNER JOIN dbo_Conversacion_Aseguradora ON dbo_T_Expediente.Id_Expediente = dbo_Conversacion_Aseguradora.Expediente) INNER JOIN dbo_Conversacion_Trabajadores ON dbo_T_Expediente.Id_Expediente = dbo_Conversacion_Trabajadores.Expediente) INNER JOIN dbo_Conversacion_Peritos ON dbo_T_Expediente.Id_Expediente = dbo_Conversacion_Peritos.Expediente) INNER JOIN dbo_Conversacion_Asegurados ON dbo_T_Expediente.Id_Expediente = dbo_Conversacion_Asegurados.Expediente;


El problema es que se me repiten los campos por cada tabla es decir:
Si en mensaje con aseguradora pongo buenos dias, me saldría
buenos dias
buenos dias
buenos dias
buenos dias
buenos dias

yo lo que quiero es una sola tabla con las conversaciones ordenadas por las fechas.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Ayuda con Consulta

Publicado por Leonardo Josué (1111 intervenciones) el 02/03/2018 16:12:06
Hola José María:

Sin datos de ejemplo resulta complicado tratar de darte una respuesta puntual, pero según lo que planteas, en lugar de hacer JOIN's deberías de tratar de hacer UNION's. Veamos un ejemplo para ver si te sirve:

Supongamos que tienes estas tablas:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
mysql> SELECT * FROM conversacion_peritos;
+---------------+---------------------------+---------------------+
| id_expediente | conversacion              | fecha               |
+---------------+---------------------------+---------------------+
|             1 | hola perito uno           | 2018-03-02 07:35:00 |
|             1 | hola perito dos           | 2018-03-02 07:36:00 |
|             1 | ¿cómo están las cosas?    | 2018-03-02 07:37:00 |
|             1 | todo sin novedad          | 2018-03-02 07:38:00 |
+---------------+---------------------------+---------------------+
4 rows in set (0.00 sec)
 
mysql> SELECT * FROM conversacion_aseguradora;
+---------------+---------------------------------------------+---------------------+
| id_expediente | conversacion                                | fecha               |
+---------------+---------------------------------------------+---------------------+
|             1 | Aseguradora x, en qué podemos ayudar        | 2018-03-02 10:05:00 |
|             1 | Tuve un accidente y necesito una ambulancia | 2018-03-02 10:06:00 |
|             1 | Claro, por favor indiqueme la dirección     | 2018-03-02 10:07:00 |
|             1 | Av. Siempreviva 742                         | 2018-03-02 10:08:00 |
|             1 | Enseguida Sr. Homero                        | 2018-03-02 10:09:00 |
+---------------+---------------------------------------------+---------------------+
5 rows in set (0.00 sec)

Tal como lo estás haciendo, si usas un INNER JOIN entre las tablas tienes algo así:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
mysql> SELECT *
    -> FROM conversacion_peritos
    -> INNER JOIN conversacion_aseguradora
    -> ON conversacion_peritos.id_expediente = conversacion_aseguradora.id_expediente;
+---------------+---------------------------+---------------------+---------------+---------------------------------------------+---------------------+
| id_expediente | conversacion              | fecha               | id_expediente | conversacion                                | fecha               |
+---------------+---------------------------+---------------------+---------------+---------------------------------------------+---------------------+
|             1 | hola perito uno           | 2018-03-02 07:35:00 |1              | Aseguradora x, en qué podemos ayudar        | 2018-03-02 10:05:00 |
|             1 | hola perito dos           | 2018-03-02 07:36:00 |1              | Aseguradora x, en qué podemos ayudar        | 2018-03-02 10:05:00 |
|             1 | ¿cómo están las cosas?    | 2018-03-02 07:37:00 |1              | Aseguradora x, en qué podemos ayudar        | 2018-03-02 10:05:00 |
|             1 | todo sin novedad          | 2018-03-02 07:38:00 |1              | Aseguradora x, en qué podemos ayudar        | 2018-03-02 10:05:00 |
|             1 | hola perito uno           | 2018-03-02 07:35:00 |1              | Tuve un accidente y necesito una ambulancia | 2018-03-02 10:06:00 |
|             1 | hola perito dos           | 2018-03-02 07:36:00 |1              | Tuve un accidente y necesito una ambulancia | 2018-03-02 10:06:00 |
|             1 | ¿cómo están las cosas?    | 2018-03-02 07:37:00 |1              | Tuve un accidente y necesito una ambulancia | 2018-03-02 10:06:00 |
|             1 | todo sin novedad          | 2018-03-02 07:38:00 |1              | Tuve un accidente y necesito una ambulancia | 2018-03-02 10:06:00 |
|             1 | hola perito uno           | 2018-03-02 07:35:00 |1              | Claro, por favor indiqueme la dirección     | 2018-03-02 10:07:00 |
|             1 | hola perito dos           | 2018-03-02 07:36:00 |1              | Claro, por favor indiqueme la dirección     | 2018-03-02 10:07:00 |
|             1 | ¿cómo están las cosas?    | 2018-03-02 07:37:00 |1              | Claro, por favor indiqueme la dirección     | 2018-03-02 10:07:00 |
|             1 | todo sin novedad          | 2018-03-02 07:38:00 |1              | Claro, por favor indiqueme la dirección     | 2018-03-02 10:07:00 |
|             1 | hola perito uno           | 2018-03-02 07:35:00 |1              | Av. Siempreviva 742                         | 2018-03-02 10:08:00 |
|             1 | hola perito dos           | 2018-03-02 07:36:00 |1              | Av. Siempreviva 742                         | 2018-03-02 10:08:00 |
|             1 | ¿cómo están las cosas?    | 2018-03-02 07:37:00 |1              | Av. Siempreviva 742                         | 2018-03-02 10:08:00 |
|             1 | todo sin novedad          | 2018-03-02 07:38:00 |1              | Av. Siempreviva 742                         | 2018-03-02 10:08:00 |
|             1 | hola perito uno           | 2018-03-02 07:35:00 |1              | Enseguida Sr. Homero                        | 2018-03-02 10:09:00 |
|             1 | hola perito dos           | 2018-03-02 07:36:00 |1              | Enseguida Sr. Homero                        | 2018-03-02 10:09:00 |
|             1 | ¿cómo están las cosas?    | 2018-03-02 07:37:00 |1              | Enseguida Sr. Homero                        | 2018-03-02 10:09:00 |
|             1 | todo sin novedad          | 2018-03-02 07:38:00 |1              | Enseguida Sr. Homero                        | 2018-03-02 10:09:00 |
+---------------+---------------------------+---------------------+---------------+---------------------------------------------+---------------------+
20 rows in set (0.00 sec)

Es decir, se hace una especie de PRODUCTO CARTESIANO entre tus tablas, entonces, lo que pues hacer es hacer un UNION's:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
mysql> SELECT *
    -> FROM conversacion_peritos
    -> UNION ALL
    -> SELECT * FROM
    -> conversacion_aseguradora;
+---------------+---------------------------------------------+---------------------+
| id_expediente | conversacion                                | fecha               |
+---------------+---------------------------------------------+---------------------+
|             1 | hola perito uno                             | 2018-03-02 07:35:00 |
|             1 | hola perito dos                             | 2018-03-02 07:36:00 |
|             1 | ¿cómo están las cosas?                      | 2018-03-02 07:37:00 |
|             1 | todo sin novedad                            | 2018-03-02 07:38:00 |
|             1 | Aseguradora x, en qué podemos ayudar        | 2018-03-02 10:05:00 |
|             1 | Tuve un accidente y necesito una ambulancia | 2018-03-02 10:06:00 |
|             1 | Claro, por favor indiqueme la dirección     | 2018-03-02 10:07:00 |
|             1 | Av. Siempreviva 742                         | 2018-03-02 10:08:00 |
|             1 | Enseguida Sr. Homero                        | 2018-03-02 10:09:00 |
+---------------+---------------------------------------------+---------------------+
9 rows in set (0.00 sec)

Haz la prueba y nos comentas.

Saludos
Leo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar

Ayuda con Consulta

Publicado por José Maria (7 intervenciones) el 07/03/2018 10:02:13
Era exactamente eso, tenía que hacer un UNION.
Ahora me surge el siguiente problema, al hacer un union las tablas tienen que tener las mismas columnas, pero y si una de esas tablas tiene 8 campos en lugar de 7 como las demás?
Se puede hacer algo?
He pensado en meter otro campo a las tablas con 7 campos para poder hacer el union pero creo que eso es una chapuza jejeje, seguro que debe de haber otra forma.

Un saludo y muchisimas gracias
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Ayuda con Consulta

Publicado por Leonardo Josué (1111 intervenciones) el 07/03/2018 15:47:08
Hola de nuevo José María:

No es necesario crear un nuevo campo en tus tablas, lo que puedes hacer simplemente es "simular" ese campo al hacer el SELECT, pero sin tener que modificar tu modelo. Checa este ejemplo, supongamos que tienes estas dos tablas:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
mysql> SELECT * FROM tabla_a;
+--------+------------+
| codigo | nombre     |
+--------+------------+
|      1 | prueba uno |
|      2 | prueba uno |
+--------+------------+
2 rows in set (0.00 sec)
 
mysql> SELECT * FROM tabla_b;
+--------+------------+-------------+
| codigo | nombre     | otro_campo  |
+--------+------------+-------------+
|      1 | prueba dos | otro campo  |
|      2 | prueba dos | lo que sea  |
+--------+------------+-------------+
2 rows in set (0.00 sec)

Entonces, para poder hacer el UNION entre las tablas tienes de dos sopas,

1. "quitas" el campo adicional de tu tabla B al hacer el SELECT, es decir, haces esto:

1
2
3
4
5
6
7
8
9
10
11
12
mysql> SELECT codigo, nombre FROM tabla_a
    -> UNION ALL
    -> SELECT codigo, nombre FROM tabla_b;
+--------+------------+
| codigo | nombre     |
+--------+------------+
|      1 | prueba uno |
|      2 | prueba uno |
|      1 | prueba dos |
|      2 | prueba dos |
+--------+------------+
4 rows in set (0.00 sec)

2. "creas" una columna al vuelo en tu tabla A para que se adecue al número de columnas de tu tabla B:

1
2
3
4
5
6
7
8
9
10
11
12
mysql> SELECT codigo, nombre, NULL otro_campo FROM tabla_a
    -> UNION ALL
    -> SELECT codigo, nombre, otro_campo FROM tabla_b;
+--------+------------+-------------+
| codigo | nombre     | otro_campo  |
+--------+------------+-------------+
|      1 | prueba uno | NULL        |
|      2 | prueba uno | NULL        |
|      1 | prueba dos | otro campo  |
|      2 | prueba dos | lo que sea  |
+--------+------------+-------------+
4 rows in set (0.00 sec)

Aquí puedes inicializar la columna "nueva" con NULL o con cualquier otro cualquier otro valor y todos los registros de la tabla "heredan" ese valor, pero esto no implica que se haga ningún cambió físico en tus tablas. puedes agregar tantos campos "virtuales" necesites.

Haz la prueba y nos comentas

Saludos
Leo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar

Ayuda con Consulta

Publicado por José Maria (7 intervenciones) el 08/03/2018 15:25:30
Es perfecto eso, ahora el problema que tengo es al hacer el INNER JOIN

Por ejemplo:

Select (Expediente,Conversacion,fecha_modificado,Hora_modificado,Usuario,Enviado_Recibido,Telefono_Email
from Conversacion_Aseguradora
LEFT JOIN T_Empleados ON Conversacion_Aseguradora.Usuario = T_Empleados.Id_Empleado
)
UNION ALL
Select Expediente,Conversacion,fecha_modificado,Hora_modificado,Usuario,Enviado_Recibido,Telefono_Email
from Conversacion_Trabajadores
UNION ALL
Select Expediente,Conversacion,fecha_modificado,Hora_modificado,Usuario,Enviado_Recibido,Telefono_Email
from Conversacion_Peritos
UNION ALL
Select Expediente,Conversacion,fecha_modificado,Hora_modificado,Usuario,Enviado_Recibido,Telefono_Email
from Conversacion_Asegurados


Cuando intento hacer el JOIN me dice que hay error si lo quito me funciona perfectamente el Union.
En lugar de Usuario, quiero poner Nombre_E que es de una tabla que tengo que se llama Empleado.
Ese JOIN lo tengo en otras consultas y funciona perfecto,por lo que el problema es que no se hacer bien el JOIN con el UNION, ahí debe estar el fallo, pero no sé como es.

GRacias
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Ayuda con Consulta

Publicado por Leonardo Josué (1111 intervenciones) el 08/03/2018 16:25:48
Hola de nuevo José María:

Prueba así:

1
2
3
4
5
6
( SELECT Expediente,Conversacion,fecha_modificado,Hora_modificado,Usuario,Enviado_Recibido,Telefono_Email
  FROM Conversacion_Aseguradora
  LEFT JOIN T_Empleados ON Conversacion_Aseguradora.Usuario = T_Empleados.Id_Empleado
)
UNION ALL
SELECT ...

y si esto no funciona, entonces hacerlo como una subconsulta, es decir, así:

1
2
3
4
5
6
7
SELECT * FROM
(  SELECT Expediente,Conversacion,fecha_modificado,Hora_modificado,Usuario,Enviado_Recibido,Telefono_Email
   FROM Conversacion_Aseguradora
   LEFT JOIN T_Empleados ON Conversacion_Aseguradora.Usuario = T_Empleados.Id_Empleado
) T
UNION ALL
SELECT ...

Haz la prueba y nos comentas.

Saludos
Leo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar

Ayuda con Consulta

Publicado por José Maria (7 intervenciones) el 08/03/2018 18:43:38
La primera no funciona, la segunda sí.

Muchísimas gracias me has salvado de una buena y he aprendido bastante.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Revisar política de publicidad