¿Cómo buscar al unir 3 tablas pero excluir el resultado de una de ellas?

He estado tratando durante horas para obtener un resultado en particular y no he encontrado ninguna respuesta en la web, y como no soy un experto en SQL en todos, Estoy haciendo una pregunta aquí.

Tengo 3 mesas: user (id, name...), cars (id, type, color, engine power...) y una tabla intermedia para guardar todas las puntuaciones que los usuarios le dieron al coche: scores (id, user_id, car_id, score).

Estoy tratando de encontrar una consulta que pueda devolver para un usuario en particular, todos los autos que él no ha calificado todavía. He intentado lo siguiente pero devuelve nulo:

$q=mysql_query("SELECT * FROM cars LEFT OUTER JOIN scores ON cars.id = scores.car_id WHERE scores.user_id != ('".$userId."')");

¿Alguien tiene una pista?

preguntado el 27 de agosto de 11 a las 18:08

3 Respuestas

SELECT
  *
FROM
  cars
WHERE
  NOT EXISTS (SELECT 1 FROM scores WHERE car_id = cars.id AND user_id = ?)

dónde ? es el ID de ese usuario en particular.

Un índice compuesto en scores encima (car_id, user_id) es útil aquí.

Respondido 27 ago 11, 22:08

¡Vaya, funciona perfecto, mil millones de gracias! Revisaré el índice compuesto del que hablaste, nunca lo usé antes ... - BoDeX

Puede usar su código con una pequeña modificación:

SELECT * FROM cars 
LEFT OUTER JOIN scores ON cars.id = scores.car_id and scores.user_id=".$userId."
WHERE scores.id IS NULL

Respondido 28 ago 11, 01:08

+1 Esa es la alternativa. Aunque en mi humilde opinión no es tan expresivo como NO EXISTE. - Tomalak

@Zapadlo ¿Podrías explicar tu comentario? ¿Qué es totalmente :) incorrecto en esta consulta? Creo que antes de publicar un comentario como este, debería leer más sobre sql y unirse a la izquierda :) - Andrej Ludinovskov

@Zapadlo De acuerdo, tengo autos mixtos y puntajes. Editado. Gracias - Andrej Ludinovskov

Muchas gracias a todos, ¡me ayudó mucho! - BoDeX

@Andrey: También podrías usar SELECT cars.* FROM ... ya que no quieres los campos del scores tabla para mostrar. Después de todo, serán todos NULL. - ypercubeᵀᴹ

SELECT * FROM
car c
WHERE c.id NOT IN (
    SELECT s.car_id
    FROM score s, user u
    WHERE u.id = s.user_id
        AND u.id = ?
)

Respondido 27 ago 11, 23:08

¿Realmente necesitas el user ¿mesa? - ypercubeᵀᴹ

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.