MySQL – Seleccionar todo excepto lo que está en esta tabla

Quiero seleccionar todas las imágenes que un usuario aún no tiene.

Tengo tres tablas: user , image e user_image :

  • _usuario (id, usuario, pase)
  • _image (id, datos)
  • _user_image (id, user_id, image_id)

Usar LEFT JOIN/IS NULL


  SELECT DISTINCT i.data FROM IMAGE i JOIN USER_IMAGE ui ON ui.image_id = i.id LEFT JOIN USER u ON u.id = ui.user_id AND u.user = ? WHERE u.id IS NULL 

Usando NOT IN


 SELECT DISTINCT i.data FROM IMAGE i JOIN USER_IMAGE ui ON ui.image_id = i.id WHERE ui.user_id NOT IN (SELECT u.id FROM USER u WHERE u.user = ?) 

Usando NOT EXISTS


 SELECT DISTINCT i.data FROM IMAGE i JOIN USER_IMAGE ui ON ui.image_id = i.id WHERE NOT EXISTS(SELECT NULL FROM USER u WHERE u.id = ui.user_id AND u.user = ?) 

Actuación:


LEFT JOIN/IS NULL y NOT IN proporcionan un performance equivalente: NOT EXISTS es ~ 30% less eficiente. Mira esto para más detalles .

Puedes hacerlo bastante fácilmente con una subconsulta:

 SELECT * FROM image WHERE id NOT IN (SELECT image_id FROM user_image WHERE user_id = THE_USER_ID); 
 select * from _image where id not in (select image_id from _user_image where user_id = ?) 

Tratar:

 SELECT i.* FROM _image i LEFT JOIN _user_image u ON u.image_id = i.id WHERE u.user_id != <user-id> 

select id, date de la image donde id no esté (select image_id de user_image donde user_id =

Hay una manera más rápida, pero esto es más fácil de seguir.

Otra forma sería:

select id, datos de la image de la izquierda join user_image en user.id = user_image.user_id donde user_image.id = null