Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

689
Views
lista de miembros consulta SQL sin mostrar amigos mutuos, amigos pendientes de aprobación, amigos bloqueados

Tengo una CONSULTA SQL compleja. Necesito ayuda para las siguientes condiciones:

Estoy buscando una consulta SQL con las siguientes condiciones:

 SELECT * FROM Table_1,Table_2 where user_id = '16' // 16 = ($_SESSION[ 'SESS_USER_ID' ])
  • CONDICIÓN 1 -> NO MOSTRARME (ID de usuario de inicio de sesión ACTUAL. => 16 (SOY YO) ($_SESSION[ 'SESS_USER_ID' ]))
  • CONDICIÓN 2 -> NO MOSTRAR user_id 25, 26, 27, 28 en la lista porque ya están en table_2 con algunas condiciones para user_id ='16' y CONDICIÓN 0,1 de friend_status
  • CONDICIÓN 3 -> ORDEN POR actualización de registro

Ejemplo del resultado que espero a continuación: LO QUE NECESITO -> Necesito los resultados que muestren todos los miembros para iniciar sesión 'user_id' que no están en Table_2 'friend_status' CONDICIÓN (0,1,2)

En los resultados de la tabla a continuación, puede ver que el inicio de sesión 'user_id' (16 en este ejemplo) no puede ver otros 'user_id' que están en Table_2 CONDITION (0,1,2) incluido él mismo como el inicio de sesión 'user_id' (16)

 //Perfect SQL results for me. +—————————+—————————————+ + user_id +signupdate + +—————————+—————————————+ + 23 + 2020-11-30 + +—————————+—————————————+ + 24 + 2020-11-30 + +—————————+—————————————+ + 28 + 2020-11-30 + +—————————+—————————————+ + 21 + 2020-11-30 + +—————————+—————————————+

LO QUE NECESITO -> Necesito una CONSULTA SQL para mostrar resultados que muestren todos los miembros para el inicio de sesión 'user_id' (16) que no están en Table_2 'friend_status' CONDICIÓN (0,1,2)

PROBLEMA-> Los resultados que obtengo a continuación no coinciden con la CONDICIÓN solicitada de 'friend_status' (0,1,2) de Table_2.

¿POR QUÉ? Debido a que el inicio de sesión 'user_id' no debería ver todas las CONDICIONES 'friend_status' (0,1,2) en los resultados completos de la página de miembros que NO tienen CONDICIONES (0,1,2)

¿POR QUÉ? Debido a que estos resultados de SQl CONDICIÓN (0,1,2) se muestran en otros lugares en 3 páginas de resultados diferentes para cada CONDICIÓN (0,1,2) -> No es el tema de hoy.

 //Wrong SQL results for me. +—————————+—————————————+ + user_id +signupdate +—————————+—————————————+ + 16 + 2020-11-30 + <— SHOULD DO NOT SHOW, CONDITION-> ITS ME “login” $user_id = '16' +—————————+—————————————+ + 23 + 2020-11-30 + +—————————+—————————————+ + 24 + 2020-11-30 + +—————————+—————————————+ + 25 + 2020-11-30 +<— SHOULD NOT SHOW -> TABLE_2 CONDITION user_id = ( $_SESSION[ 'SESS_USER_ID' ])='16' AND CONDITION2 friend_status= '0'(Pending approval Mutual friends) +—————————+—————————————+ + 26 + 2020-11-30 +<— SHOULD NOT SHOW -> TABLE_2 CONDITION user_id = ( $_SESSION[ 'SESS_USER_ID' ])='16' AND CONDITION2 friend_status= '0' (Pending approval Mutual friends) +—————————+—————————————+ + 27 + 2020-11-30 +<— SHOULD NOT SHOW -> TABLE_2 CONDITION user_id = ( $_SESSION[ 'SESS_USER_ID' ])='16' AND CONDITION2 friend_status= '1' (Mutual friends) +—————————+—————————————+ + 28 + 2020-11-30 +<— SHOULD NOT SHOW -> TABLE_2 CONDITION user_id = ( $_SESSION[ 'SESS_USER_ID' ])='16' AND CONDITION2 friend_status= '2' (Blocked) +—————————+—————————————+ + 21 + 2020-11-30 + +—————————+—————————————+

TABLE_2 (tabla para relación de amigos) friend_status='0' -> Esto significa 'user_id' pendiente de aceptación de amistad por parte de 'user_id_resquest' -> No mostrar en la lista completa de miembros para iniciar sesión 'user_id' friend_status='1' -> Este 'user_id ' y 'user_id_resquest' ya son amigos mutuos. -> No mostrar en la lista completa de miembros para iniciar sesión user_id friend_status='2' -> Esto significa que 'user_id' está bloqueado por 'user_id_resquest' -> No mostrar en la lista de miembros para el inicio de sesión actual user_id

 +——————————————+—————————+——————————————+—————————————————+ +friendship_id + user_id + user_id_request + friend_status+ +——————————————+—————————+——————————————+—————————————————+ + 1 + 16 + 26 + 0 +//0->Pending +——————————————+—————————+——————————————+—————————————————+ + 2 + 16 + 25 + 0 +//0->Pending +——————————————+—————————+——————————————+—————————————————+ + 3 + 16 + 27 + 1 +//1->Mutual +——————————————+—————————+——————————————+—————————————————+ + 4 + 21 + 27 + 1 +//1->Mutual +——————————————+—————————+——————————————+—————————————————+ + 5 + 16 + 28 + 2 +//2 ->blocked +——————————————+—————————+——————————————+—————————————————+

TABLE_1 (tabla de todos los usuarios)

 +—————————+—————————————+ + user_id + signupdate + +—————————+—————————————+ + 16 + 2020-11-30 + +—————————+—————————————+ + 23 + 2020-11-30 + +—————————+—————————————+ + 24 + 2020-11-30 + +—————————+—————————————+ + 25 + 2020-11-30 + +—————————+—————————————+ + 26 + 2020-11-30 + +—————————+—————————————+ + 27 + 2020-11-30 + +—————————+—————————————+ + 28 + 2020-11-30 + +—————————+—————————————+
over 4 years ago · Santiago Trujillo
3 answers
Answer question

0

En primer lugar, elimine la combinación de coma y reemplácela con JOIN ; un LEFT JOIN en particular. Además, básicamente está haciendo una CROSS JOIN al no agregar un WHERE en las columnas coincidentes entre las dos tablas. Aunque no estoy seguro de si eso es lo que pretendías hacer.

Prueba con esta consulta:

 SELECT COALESCE(t2.user_id,t1.user_id) AS user_id, t1.signupdate, CASE WHEN t2.user_id='16'/*($_SESSION[ 'SESS_USER_ID' ])*/ AND friend_status IN (0,1) THEN 0 WHEN t1.user_id='16'/*($_SESSION[ 'SESS_USER_ID' ])*/ THEN 0 ELSE 1 END AS Chk FROM Table_1 AS t1 LEFT JOIN Table_2 AS t2 ON t1.user_id = t2.user_id_request HAVING Chk=1;

En la consulta, he usado LEFT JOIN en la columna user_id de table_1 que coincide con la columna user_id_request de user_id_request . Esto se debe a que si los hago coincidir entre user_id en ambas tablas, table_2 solo mostrará donde user_id=16 y el resto como NULL , por lo tanto, los datos que desea filtrar de table_2 no aparecerán. En la sección SELECT .. de la consulta, he usado dos operaciones, COALESCE y una expresión CASE . La expresión CASE se usa para filtrar el user_id actual y asignarle 0 (cero) si coincide con la condición y le otorga 1 para otros datos que no coinciden. A este le asigné el alias Chk y lo uso al final de la consulta en HAVING . Para la parte COALESE , devuelvo cualquier user_id de usuario de table_2 primero, luego devuelvo user_id de table_1 si table_2 es NULL .

violín de demostración

Editar: sin usar HAVING , verifique la expresión CASE en WHERE como:

 SELECT COALESCE(t2.user_id,t1.user_id) AS user_id, t1.signupdate FROM Table_1 AS t1 LEFT JOIN Table_2 AS t2 ON t1.user_id = t2.user_id_request WHERE CASE WHEN t2.user_id='16'/*($_SESSION[ 'SESS_USER_ID' ])*/ AND friend_status IN (0,1) THEN 0 WHEN t1.user_id='16'/*($_SESSION[ 'SESS_USER_ID' ])*/ THEN 0 ELSE 1 END=1;
over 4 years ago · Santiago Trujillo Report

0

Parece que básicamente necesita una combinación izquierda desde la tabla de usuarios hasta quién es amigo o está pendiente. No está claro si la persona está marcada como ID = 2. Si está marcada como bloqueada, ¿no le gustaría que su nombre apareciera como una posible solicitud de amistad/amigo de todos modos? En resumen, quiere a cualquiera que no sea su (usuario conectado actual) y que no haya sido solicitado como amigo = 0, confirmado como amigo = 1, O ya solicitado pero usuario BLOQUEADO = 2. ¿Por qué mostrar el nombre de alguien que desea? obstruido.

 select T1.* from Table1 T1 where NOT T1.User_ID = ($_SESSION[ 'SESS_USER_ID' ]) AND T1.User_ID NOT IN ( select T2.user_id_request from Table2 T2 where T2.User_ID = ($_SESSION[ 'SESS_USER_ID' ])) order by T1.SignupDate

Solo asegúrese de parametrizar correctamente sus consultas y no usar variables directas para crear sus cadenas de consulta. Estará abierto a la inyección de sql.

over 4 years ago · Santiago Trujillo Report

0

No estoy seguro de cuál de los siguientes funcionará mejor con los datos reales de su proyecto, por lo que le recomiendo que compare ambos para ver si uno funciona notablemente mejor que el otro.

Códigos: ( Demostración )

  1. Subconsulta en cada fila de Table_1 que necesita 2 marcadores de posición en una declaración preparada (puede que no funcione bien)

     SELECT user_id, signupdate FROM Table_1 AS t1 WHERE user_id != 16 AND NOT EXISTS( SELECT 1 FROM Table_2 WHERE user_id_request = t1.user_id AND user_id = 16 );
  2. Unión izquierda que necesita solo 1 marcador de posición en una declaración preparada:

     SELECT t1.user_id, t1.signupdate FROM Table_1 AS t1 LEFT JOIN Table_2 AS t2 ON t1.user_id = t2.user_id_request WHERE 16 NOT IN (t1.user_id, COALESCE(t2.user_id,0)) AND t2.friendship_id IS NULL;

Ambas salidas:

 | user_id | signupdate | | ------- | ---------- | | 23 | 2020-11-30 | | 24 | 2020-11-30 | | 21 | 2020-11-30 |
over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!