[Problema]: Consulta SQL INNER JOIN 2 campos

Iniciado por Leguim, 17 Octubre 2019, 19:39 PM

0 Miembros y 1 Visitante están viendo este tema.

Leguim

Buenos días
hace 1 mes había publicado un tema donde preguntaba como podía hacer más de un "INNER JOIN" en una misma consulta...
Una de las respuesta que recibí me había servido ya que no me mostraban errores, ni ninguna advertencia pero al testearla dicha consulta no me arroja resultados..

Código (php) [Seleccionar]

SELECT U.id_user, N.id_notification, N.id_emitter, N.id_user FROM users U INNER JOIN notifications N ON U.id_user = N.id_emitter AND U.id_user = N.id_user WHERE N.id_notification = :id_notification


Tema anterior: https://foro.elhacker.net/desarrollo_web/pregunta_inner_join_de_dos_campos-t499302.0.html;msg2204406

Estoy completamente seguro que el problema esta en el INNER JOIN ya que si pruebo la misma consulta quitando algunos de los dos que tengo, es decir que sólo me quede con un solo inner join va a funcionar pero ya cuando agrego dos o más ya no va a traer resultados.

Gracias....

Carloswaldo

No entiendo la lógica de tu consulta. Veamos, tienes 2 tablas: usuarios y notificaciones, ¿qué quieres sacar en la consulta? Porque lo que yo entiendo es "sacar todas las notificaciones cuyo usuario sea el emisor y también sea el usuario (?), Y además tenga un id de notificación específico" ¿Hay un conjunto de datos que coincida con las condiciones? ¿Cuál es el resultado esperado? ¿Tienes un set de datos de ejemplo?

Leguim

#2
No, básicamente la idea era que mostrar una notificación dependiendo su id (busca por id_notification) una vez que encuentra dicha notificación con esa id intento que me devuelva todos los resultados de dicha notificación...

Eso igual creo que ya estaba claro.. ahora id_emitter y id_user estoy tratando de hacer un INNER JOIN en ambas (nunca me acuerdo como se llama esto, si "entrelazar" o nose como se dice, no me acuerdo) bueno hacer eso dos veces, pero para esto:

imaginemos que id_user es el id 1 y id_emitter es el id 2 //
tabla users sería
1. Miguel
2. Juan

para el momento en que yo imprima el dato por pantalla $resultados[0]['name'] => imagino que va a imprimir el nombre de usuario con la id 1

pero ahora que son dos datos con el INNER JOIN que apuntan a U.id_user (id_emitter, y justamente id_user pero de la tabla notifications no de la tabla users)

Ahora que son dos, imagino que se podrían imprimir así:
$resultados[0][0]['name'] => Ramon
$resultados[0][1]['name'] => Miguel

Realmente no estoy seguro que esto funcione así, pero bueno quería que se entendiera que es lo que quería  hacer aunque nose si me explique correctamente.

No, básicamente la idea era que mostrar una notificación dependiendo su id (busca por id_notification) una vez que encuentra dicha notificación con esa id intento que me devuelva todos los resultados de dicha notificación...

Eso igual creo que ya estaba claro.. ahora id_emitter y id_user estoy tratando de hacer un INNER JOIN en ambas (nunca me acuerdo como se llama esto, si "entrelazar" o nose como se dice, no me acuerdo) bueno hacer eso dos veces, pero para esto:

imaginemos que id_user es el id 1 y id_emitter es el id 2 //
tabla users sería
1. Miguel
2. Juan

para el momento en que yo imprima el dato por pantalla $resultados[0]['name'] => imagino que va a imprimir el nombre de usuario con la id 1

pero ahora que son dos datos con el INNER JOIN que apuntan a U.id_user (id_emitter, y justamente id_user pero de la tabla notifications no de la tabla users)

Ahora que son dos, imagino que se podrían imprimir así:
$resultados[0][0]['name'] => Ramon
$resultados[0][1]['name'] => Miguel

Realmente no estoy seguro que esto funcione así, pero bueno quería que se entendiera que es lo que quería  hacer aunque nose si me explique correctamente.

Edit: Para meterte en contexto este sería otro ejemplo de un sistema de tickets

Código (php) [Seleccionar]

"SELECT U.id_user, U.avatar, U.name, U.surname, U.email, U.rank, T.id_ticket, T.id_adm, T.id_user, T.type, T.id_reported, T.acceptance, T.title, T.content, T.response, T.year_date, T.month_date, T.day_date, T.hour_date, T.minute_date FROM users U INNER JOIN tickets T ON U.id_user = T.id_adm AND U.id_user = T.id_user WHERE T.id_ticket = :id_ticket"

Carloswaldo

Estoy tratando de entender bien el asunto y me he ido a leer tus otros temas. Tengo la impresión de que estás confundiendo un poco la funcionalidad de un INNER JOIN dentro de una consulta.

Tabla usuarios
id_user int
name text

Tabla notificaciones
id_notification int
id_user int
texto text

Teniendo los siguientes datos:

usuarios
id_user | name
---------+--------
1 | Carlos
2 | Miguel
3 | Juan


notificaciones
id_notificacion | id_user | texto
-----------------+---------+----------------------
1 | 2 | problema
2 | 2 | problema solucionado
3 | 1 | advertencia
4 | 3 | nota
5 | 3 | otra nota


Si yo quiero sacar los datos de todas las notificaciones con los nombres de sus respectivos usuarios:

Código (sql) [Seleccionar]
SELECT n.id_notificacion, u.name, n.texto
FROM notificaciones n
INNER JOIN usuarios u
ON n.id_user = u.id_user;


id_notificacion |  name  |        texto         
-----------------+--------+----------------------
               3 | Carlos | advertencia
               1 | Miguel | problema
               2 | Miguel | problema solucionado
               4 | Juan   | nota
               5 | Juan   | otra nota


Las 2 tablas tienen una relación entre sí y el INNER JOIN me sirve para decirle al motor de base de datos cúal es el campo que constituye la relación, en este caso el id del usuario.

Si yo quiero LIMITAR los resultados de mi consulta, me valdré de una condición. Digamos que solo quiero sacar las notificaciones de Juan:

Código (sql) [Seleccionar]
SELECT n.id_notificacion, u.name, n.texto
FROM notificaciones n
INNER JOIN usuarios u
ON n.id_user = u.id_user
WHERE u.name = 'Juan';


id_notificacion | name |   texto   
-----------------+------+-----------
               4 | Juan | nota
               5 | Juan | otra nota


O que quiero sacar las notificaciones de Juan y de Carlos:

Código (sql) [Seleccionar]
SELECT n.id_notificacion, u.name, n.texto
FROM notificaciones n
INNER JOIN usuarios u
ON n.id_user = u.id_user
WHERE u.name = 'Juan' OR u.name = 'Carlos';


id_notificacion |  name  |    texto   
-----------------+--------+-------------
               3 | Carlos | advertencia
               4 | Juan   | nota
               5 | Juan   | otra nota


Ya no necesito agregar o modificar nada de la condición del INNER JOIN porque la relación ya está hecha.

Ahora, veo que tienes un campo id_emitter, ¿para qué es este? Es posible que haya otro campo en notificaciones que también guarde un id de usuario, pero si haces esto:

Código (sql) [Seleccionar]
INNER JOIN notifications N ON U.id_user = N.id_emitter AND U.id_user = N.id_user

le estás diciendo que los datos que saque de la tabla usuarios tienen que ser de los que coincidan con mi id de usuario y (AND) al mismo tiempo tiene que coincidir con lo que haya en id_emitter, lo cual no termino de entender.

Para poder armar una consulta lo que primero que tienes que saber es ¿Qué resultado deseo obtener?, eso es lo que te pregunté y aún quiero saber. ¿Qué es lo que deseas obtener? (Olvidándose un rato de lo que luego vayas a hacer en php o cualquier lenguaje de programación que estés utilizando, que en realidad no tiene importancia hasta que saques el resultado correcto de tu consulta)

En la última consulta ¿Qué es "id_adm"?

Leguim

Creo que me confundí muchisimo con INNER JOIN
pensaba que si digamos yo tengo.. un comentario....

id_comment, id_user, text
1, 1, cualquier mensaje

y la tabla users sería
id_user, nombre
1, miguel

la idea era poder acceder a el nombre del autor del comentario con la consulta usando INNER JOIN
es decir que cuando ponga..

Código (php) [Seleccionar]

$resultados[0]['name'] => retorne 'Miguel'


Era esto lo que esperaba que haga la consulta, pero lógicamente hacerlo dos veces, según hasta donde pude entender + lo que encontré en youtube (que también me cuesta entender) respecto a esto es que el inner join sería no igual, pero si similar a un where.. pensaba que esto lo que hacía era como "conectar" o "entrelazar" datos de una tabla a otra..

id_adm sería id_admin, como dije que era un sistema de tickets digamos un usuario podría rellenar un formulario con una duda y luego podría ver quien le contesto su duda gracias al id_adm (id_admin)...

Me quede en un bloqueo, no consigo entender...

Leguim

Para hacerla sencilla hice este diagrama.


La idea es pasar esto que está en este diagrama a una consulta SQL que es lo que intento hacer pero bueno como ya dije antes... no devuelve el resultado.

Carloswaldo

Veamos...

Código (sql) [Seleccionar]

SELECT n.id_notification as ID, u1.name as Emitter, u2.name as User
FROM notifications n
INNER JOIN users u1 ON n.id_emitter = u1.id_user
INNER JOIN users u2 ON n.id_user = u2.id_user;


¿Es eso lo que quieres lograr? Espero esta vez haber entendido bien. (Tienes que hacer 2 INNER JOINs hacia la misma tabla, para diferenciarlas le pones alias diferentes)

Leguim