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

Consulta Mysql

Estas en el tema de Consulta Mysql en el foro de Mysql en Foros del Web. Buenas, tengo una duda.. Tengo Tres tablas= Tickets, Usuario_Tickets, y Usuarios En la tabla tickets almaceno un ID del ticket que fue generado En la ...
  #1 (permalink)  
Antiguo 09/10/2014, 12:12
 
Fecha de Ingreso: octubre-2014
Mensajes: 13
Antigüedad: 7 años, 1 mes
Puntos: 0
Consulta Mysql

Buenas, tengo una duda..

Tengo Tres tablas= Tickets, Usuario_Tickets, y Usuarios

En la tabla tickets almaceno un ID del ticket que fue generado
En la tabla Usuario_tickets almaceno el ID del Ticket, ID del Usuario que genero el Ticket, y el ID del tipo de usuario (Autor y UsuarioAsignado). El ID de autor es 1 y el UsuarioAsignado es 2.
En la tabla Usuarios almaceno el ID del Usuario, y el nombre de Usuario

Que pasa, quiero hacer una consulta en la que me muestre, el ID del ticket, el Autor del Ticket, y a quien fue asignado el ticket.

Pasa que en la tabla Usuario_Tickets almacena dos veces un mismo ID del ticket, por que guarda los ID del tipo de usuario (1 y 2)

Yo hice una consulta pero me salen dos celdas con mismo numero de ticket, en la primera celda me muestra el nombre del autor pero el usuario_asignado sale NULL, y en la otra celda sale el nombre del usuario_asignado y el autor sale NULL

Tengo el query de la siguiente manera

Código MySQL:
Ver original
  1. SELECT glpi_tickets.id AS id, glpi_users.firstname AS name, (select case when glpi_tickets_users.type='1' then glpi_users.realname end) as tipo1, (select case when glpi_tickets_users.type='2' then glpi_users.realname end) as tipo2
  2. FROM `glpi_tickets_users` , glpi_tickets, glpi_users
  3. WHERE glpi_tickets.id = glpi_tickets_users.`tickets_id`
  4. AND glpi_tickets_users.`users_id` = glpi_users.id
No quiero que me muestre dos celdas con mismo ID, sino una sola en la que me muestre el Autor y Usuario asignado.

Cualquier cosa en la que me podais ayudar me servira, gracias

Última edición por gnzsoloyo; 09/10/2014 a las 12:36
  #2 (permalink)  
Antiguo 09/10/2014, 12:49
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 14 años
Puntos: 2658
Respuesta: Consulta Mysql

Para el tipo de consulta que quieres, no puedes usar JOIN implícitos (la coma), sino que debes hacerlos explícitos invocando dos veces la misma tabla pero con alias....
Es decir, no es una consulta muy simple.
Pero además, me da la impresión de que tu tabla relacional tiene un error de diseño...
Si para cada Ticket existe un Autor y un UsuarioAsignado, ambos deben estar en el mismo registro, en campos separados, y apuntando a la tabla de Usuarios.

En principio, lo que quieres tal vez se resuelva así:
Código MySQL:
Ver original
  1.     T.id id,
  2.     U1.firstname name,
  3.     IF(TU.TYPE = 1, U1.realname, '') tipo1,
  4.     IF(TU.TYPE = 1, U2.realname, '') tipo2
  5. FROM glpi_tickets T
  6.     INNER JOIN `glpi_tickets_users` TU  ON T.id = TU.`tickets_id`
  7.     INNER JOIN glpi_users U1 ON TU.`users_id` = U1.id AND TU.TYPE = 1
  8.     INNER JOIN glpi_users U2 ON TU.`users_id` = U2.id AND TU.TYPE = 2
pero para que funcionen de una manera simple, las tablas deberían ser:
Cita:
Tickets(IDTicket)
Ticket_usuario(IdTicket, IdAutor, IdUsuarioAsignado)
usuario(idUsurio, Nombre, ...)
Con eso la query sería:
Código MySQL:
Ver original
  1.     T.id id,
  2.     U1.firstname name,
  3.     U1.realname tipo1,
  4.     U2.realname tipo2
  5. FROM glpi_tickets T
  6.     INNER JOIN `glpi_tickets_users` TU  ON T.id = TU.`IdTicket`
  7.     INNER JOIN glpi_users U1 ON TU.`IdAutor` = U1.id
  8.     INNER JOIN glpi_users U2 ON TU.`idusuarioAsignado` = U2.id
Mas simple, ¿no?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 09/10/2014, 13:30
 
Fecha de Ingreso: octubre-2014
Mensajes: 13
Antigüedad: 7 años, 1 mes
Puntos: 0
Respuesta: Consulta Mysql

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Para el tipo de consulta que quieres, no puedes usar JOIN implícitos (la coma), sino que debes hacerlos explícitos invocando dos veces la misma tabla pero con alias....
Es decir, no es una consulta muy simple.
Pero además, me da la impresión de que tu tabla relacional tiene un error de diseño...
Si para cada Ticket existe un Autor y un UsuarioAsignado, ambos deben estar en el mismo registro, en campos separados, y apuntando a la tabla de Usuarios.

En principio, lo que quieres tal vez se resuelva así:
Código MySQL:
Ver original
  1.     T.id id,
  2.     U1.firstname name,
  3.     IF(TU.TYPE = 1, U1.realname, '') tipo1,
  4.     IF(TU.TYPE = 1, U2.realname, '') tipo2
  5. FROM glpi_tickets T
  6.     INNER JOIN `glpi_tickets_users` TU  ON T.id = TU.`tickets_id`
  7.     INNER JOIN glpi_users U1 ON TU.`users_id` = U1.id AND TU.TYPE = 1
  8.     INNER JOIN glpi_users U2 ON TU.`users_id` = U2.id AND TU.TYPE = 2
pero para que funcionen de una manera simple, las tablas deberían ser:

Con eso la query sería:
Código MySQL:
Ver original
  1.     T.id id,
  2.     U1.firstname name,
  3.     U1.realname tipo1,
  4.     U2.realname tipo2
  5. FROM glpi_tickets T
  6.     INNER JOIN `glpi_tickets_users` TU  ON T.id = TU.`IdTicket`
  7.     INNER JOIN glpi_users U1 ON TU.`IdAutor` = U1.id
  8.     INNER JOIN glpi_users U2 ON TU.`idusuarioAsignado` = U2.id
Mas simple, ¿no?
Bien Amigo

El segundo query que colocaste no funcionaria en mi caso, ya que en la tabla Tickets_Usuario se guardan en varios registros el Autor y UsuarioAsignado con un mismo numero de ticket

De esta manera por ejemplo

IDUsuarioTicket,ID_Ticket, TipoU
1 1 1
2 1 2

El primer query es el que me sirve, pero no me arroja resultado, no muestra nada. Partiendo de ese query que colocaste, hice este
Código MySQL:
Ver original
  1.     T.id as id,
  2.     if(tu.type='1', U1.firstname, '') as name,
  3.     if(tu.type='2', U2.firstname, '') as name2
  4. FROM glpi_tickets T
  5.     INNER JOIN glpi_tickets_users TU  ON T.id = TU.tickets_id
  6.     INNER JOIN glpi_users U1 ON TU.users_id = U1.id
  7.     INNER JOIN glpi_users U2 ON TU.users_id = U2.id

Arroja los resultados pero se repiten y se muestran de la siguiente manera

IDTicket, Autor, Asignado
19 Fernando NULL
19 NULL Alejandro

Esta parte del primer query que enviaste
Código MySQL:
Ver original
  1. INNER JOIN glpi_users U1 ON TU.`users_id` = U1.id AND TU.TYPE = 1
  2.     INNER JOIN glpi_users U2 ON TU.`users_id` = U2.id AND TU.TYPE = 2
No funcionaba, asi que deje solamente los if que estan mas arriba en el select.

Esta dificil la cosa no?

Última edición por gnzsoloyo; 09/10/2014 a las 13:52
  #4 (permalink)  
Antiguo 09/10/2014, 13:54
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 14 años
Puntos: 2658
Respuesta: Consulta Mysql

Cita:
El segundo query que colocaste no funcionaria en mi caso, ya que en la tabla Tickets_Usuario se guardan en varios registros el Autor y UsuarioAsignado con un mismo numero de ticket
Precisamente, si lees con más cuidado lo que te puse, verás que te estoy diciendo que la tabla que tienes está MAL diseñada, de acuerdo al uso que describes.

Esto muestra un modelado de relaciones incorrecto:
Cita:
IDTicket, Autor, Asignado
19 Fernando NULL
19 NULL Alejandro
El segundo query lo estoy basando en una modificación que puedas hacer a fin de modelar correctamente la relación, y por ende corregir la estructura de tus tablas.
Si quieres hcerlo o no, depende de ti.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 09/10/2014, 14:32
 
Fecha de Ingreso: octubre-2014
Mensajes: 13
Antigüedad: 7 años, 1 mes
Puntos: 0
Respuesta: Consulta Mysql

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Precisamente, si lees con más cuidado lo que te puse, verás que te estoy diciendo que la tabla que tienes está MAL diseñada, de acuerdo al uso que describes.

Esto muestra un modelado de relaciones incorrecto:


El segundo query lo estoy basando en una modificación que puedas hacer a fin de modelar correctamente la relación, y por ende corregir la estructura de tus tablas.
Si quieres hcerlo o no, depende de ti.
Tienes razon, las tablas estan mal diseñadas, pero no es mi culpa, ya son tablas prediseñadas de una herramienta de la cual quiero sacar esos datos. Pero ya pude solventar la falla. He optado por usar MIN(CASE y al final colocar GROUP BY T.id, en este ejemplo no funciona de esa manera, lo que pasa es que tengo todo eso dentro de una consulta global y de esa manera funciono. Igualmente muchisimas gracias.

Etiquetas: select, tabla
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 23:07.