Home Foros Foro dudas Foro de PHP/MySql Consulta en MYSQL Respuesta a: Consulta en MYSQL

Respuesta a: Consulta en MYSQL

Home Foros Foro dudas Foro de PHP/MySql Consulta en MYSQL Respuesta a: Consulta en MYSQL

#8810

Miguel Aguirre
Participante

Acabo de crear las tablas muy similares a las tuyas (salvando pequeñas diferencias en los nombres de los campos) y probando con lo que me has pasado. Lo que te funcionaria sería esto:

select u.id, u.usuario, t1.TelNumero as TelParticular, t2.TelNumero as TelLaboral
from usuarios u
left join (
select idUsuario, TelNumero from telefonos where tipo = ‘PART’
) as t1 ON t1.idUsuario = u.id
left join (
select idUsuario, TelNumero from telefonos where tipo = ‘LABO’
) as t2 ON t2.idUsuario = u.id
where u.id = 2

Efectivamente, en subconsultas no se admite el uso de limit, no te habia entendido, pero la razon de esta restriccion es muy clara, si es una subconsulta necesitas el discriminante, no el primer registro encontrado. Necesitas decirle al join sobre qué usuario buscar, no limitar la busqueda a un solo registro.

Para limpieza en el modelo de datos te recomendaría que quitases el id autoincremental porque es un campo irrelevante en una tabla cruzada dependiente y que el campo idUsuariode la tabla de teléfonos fuese UNIQUE y, si la tabla se va a poblar mucho, de tipo KEY para facilitar el indexado y mejorar el rendimiento en las búsquedas. Por otro lado, y en este caso para garantizar la integridad referencial y mantener un correcto modelo de datos, te diria que sería interesante asociar el id de la tabla de usuarios con el idUsuario de la tabla telefonos de tal forma que al borrar en la primera tabla, se elimine en cascada el registro de la segunda. Para esto último puedes utilizar constraints o disparadores (te diria que practicases ambos metodos pero que no abuses de meter lógica de negocio en base de datos, si hay una aplicacion que borre datos de la tabla de usuarios, que sea la misma aplicacion la que se encargue de borrar en la otra en lugar de encargar de eso a la base de datos, hacerlo por base de datos dificulta mucho el escalado del software y la deteccion de errores, te lo digo por experiencia, pero eso ya es otra pelicula jejejeje)

 

Un saludo y buen dia 😉