2011-03-12 12 views
22

Tengo dos tablas: projects y user_licenses.MySQL LEFT JOIN con valor opcional en la segunda tabla

Me gustaría obtener toda la lista de proyectos de la base de datos, así como el estado actual de la licencia del usuario. La tabla de licencias tiene un campo de ID de usuario que verifico contra una variable $_SESSION para el valor. El caso es que es posible que no tengan una licencia o que un visitante que no ha iniciado sesión quiera ver la lista de proyectos. Mi pregunta es: ¿cómo puedo obtener los datos de la tabla de la izquierda siempre pantalla, pero solo tomar datos de esa fila de la tabla correcta cuando se cumplen ciertas condiciones?

La consulta que tengo en este momento es la siguiente:

SELECT Projects.*, 
      UserLicenses.* 
    FROM Projects 
LEFT JOIN UserLicenses ON Projects.id = UserLicenses.project_id 
    WHERE UserLicenses.user_id = 12 
ORDER BY name ASC 
+0

Creo que debe proporcionar datos de muestra y resultados esperados para comunicar lo que está buscando. –

Respuesta

38

pueden añadir nuevas condiciones adicionales para la on cláusula de la izquierda unirse. Solo afectarán la mesa unida.

SELECT Projects.*, 
      UserLicenses.* 
    FROM Projects 
LEFT JOIN UserLicenses 
     ON Projects.id = UserLicenses.project_id 
      and UserLicenses.user_id = 12 
      and UserLicences.Question = '6*7' 
      and UserLicences.Answer = 42 
ORDER BY name ASC 

Esto devolverá proyectos sin licencias coincidentes.

+0

¡Gracias! Funciona un placer – Bojangles

+2

gracias! Entonces la clave es usar ON y no DONDE. Estuve atrapado por un tiempo hasta que encontré esto. – tstyle

+0

Tuve un problema para editar una docena de consultas por su culpa. –

3

Mover la condición UserLicenses de distancia de donde, y hasta la condición de unión. Al tenerlo en la parte DONDE, nunca verá esas filas "izquierdas" porque se filtran.

Probablemente también use WHERE (UserLicenses.user_id = 12 OR UserLicenses.user_id IS NULL) No haga eso. Sólo moverlo a la condición de combinación de esta manera:

LEFT JOIN UserLicenses ON (Projects.id = UserLicenses.project_id AND UserLicenses.user_id = 12)

0

Puede utilizar LEFT JOIN

Si su partido condiciones a continuación muestran los valores de lo contrario se muestre el valor nulo.