Estoy almacenando datos en el perfil de usuario, por ejemplo

userid | field_title | field_value
1      |   fname     |  JD1
1      |   lname     |  JD1
1      |   website   |  www.JD 
2      |   fname     |  JD2
2      |   lname     |  JD2
2      |   website   |  www.JD2
3      |   fname     |  JD3
3      |   lname     |  JD3
4      |   fname     |  JD4
4      |   lname     |  JD4
4      |   website   |  www.JD

Como puede ver en el ejemplo anterior, estoy almacenando datos horizontalmente.

Entonces, el ID de usuario 1,2 y 4 tiene sitio web. Pero, el ID de usuario 3 no tiene un sitio web.

Ahora, cuando escribo una consulta. Digamos que el nombre de la mesa es foo

select * from foo where title!="website"

Me devolverá los 4.

¿Cómo escribo una consulta para obtener solo 3?

0
John Doe 8 sep. 2018 a las 13:31

3 respuestas

La mejor respuesta

Básicamente, debe buscar usuarios donde ninguno de sus entradas tenga el field_title de 'website'. Esto se puede lograr con una cláusula NOT EXISTS:

SELECT *
FROM foo f1
WHERE NOT EXISTS (SELECT *
                  FROM foo f2
                  WHERE field_title = 'website' AND f1.userid = f2.userid)

Salida:

userid  field_title     field_value
3       fname           JD3
3       lname           JD3
0
Nick 8 sep. 2018 a las 12:36

Si tiene una clave principal en su tabla, intente, suponiendo aquí id

SELECT f1.userid 
FROM   foo f1 
       LEFT JOIN foo f2 
              ON ( f1.userid = f2.userid 
                   AND f1.id < f2.id ) 
WHERE  f2.id IS NULL 
       AND f1.field_title != "website"; 
0
Sonam Tripathi 8 sep. 2018 a las 11:28

Suponiendo que tiene una tabla llamada user que almacenó un usuario por fila, puede hacer esto:

SELECT u.id from user u 
LEFT JOIN user_attributes ua 
 ON (u.id = ua.id AND ua.field_title='website')
WHERE ua.field_title IS NULL

Dado que un LEFT JOIN garantiza que tiene al menos una fila noe para cada usuario, independientemente de si la cláusula ON coincide con una cláusula ON que coincida con algo que no desea y luego tiene un {{ La cláusula X3}} en la que uno de los campos que normalmente no es NULL se filtra cuando NULL devolverá una fila con el usuario 3.

0
Sylwester 8 sep. 2018 a las 20:07