Tengo esto, y quiero obtener sus nombres de "compañía" para cada uno.

SELECT `client`.`name`,`client`.`lastname`
FROM `check`,`reserv`,`client`
WHERE `check`.`idReserv`=`reserv`.`id`
AND `reserv`.`idPerson`=`client`.`id`
ORDER BY `check`.`id`

, y quiero obtener sus nombres de "compañía" para cada uno, de la tabla "compañía".

Así que probé esto:

SELECT `client`.`name`,`client`.`lastname`, `company`.`name`
FROM `check`,`reserv`,`client`,`company`
WHERE `reserv`.`idCompany`=`company`.`id`
AND `check`.`idReserv`=`reserv`.`id`
AND `reserv`.`idPerson`=`client`.`id`
ORDER BY `check`.`id`

Pero hay algunas personas en la tabla "reserv" con una "idCompany" inexistente. así que con esa condición, esta consulta solo me muestra personas que tienen un "id" existente en la tabla "empresa". Quiero mostrar a las personas sin compañía y el espacio de company.name en blanco si no hay compañía

Intenté muchas formas incluso con uniones, pero no puedo solucionarlo. Estoy cansado de escribir "compañía" también.

0
Feber Castellon 19 jun. 2017 a las 18:26

3 respuestas

La mejor respuesta

El estándar ANSI 89 utiliza la notación , para las uniones de tabla con los criterios de la unión en la cláusula where. Sin embargo, no creo que mySQL sea compatible con este estilo externo de combinación necesario para resolver su problema. Para expresar una unión externa en esta sintaxis, necesitaría usar un *= para la unión izquierda o =* para una unión derecha; pero de nuevo no estoy seguro de que mySQL lo admita.

Así que en su caso:

SELECT `client`.`name`,`client`.`lastname`, `company`.`name`
FROM `check`,`reserv`,`client`,`company`
WHERE `reserv`.`idCompany`*=`company`.`id`
  AND `check`.`idReserv`=`reserv`.`id`
  AND `reserv`.`idPerson`=`client`.`id`
ORDER BY `check`.`id`

Sin embargo, encuentro que la notación es difícil de leer y no es necesario que se escapen todos los nombres de tabla / columna (excepto las palabras reservadas) ... por lo que a continuación se siguen los estándares ANSI 92 que permiten el uso de la sintaxis de unión INNER y LEFT para explícitamente Definir el tipo de unión. Ambas anotaciones deberían optimizarse para el mismo plan de ejecución, de modo que cualquiera de las dos funciona (siempre que mySQL admita la notación * =) también; es solo una cuestión de qué estándar eliges usar.

SELECT client.name
     , client.lastname
     , company.name
FROM `check`
INNER JOIN reserv
  on `check`.idReserv=reserv.id
INNER JOIN client
  on reserv.idPerson=client.id
LEFT JOIN company
  on reserv.idCompany=company.id
ORDER BY `check`.id
0
xQbert 19 jun. 2017 a las 16:09

En su lugar, debe usar la combinación IZQUIERDA.

SQL IZQUIERDA UNIRSE

SELECT c.name, c.lastname, co.name
FROM check AS ck
LEFT JOIN reserv AS r ON(ck.idReserv = r.id)
LEFT JOIN client AS c ON(r.idPerson = c.id)
LEFT JOIN company AS co ON(r.idCompany = co.id)
ORDER BY c.id
1
Eky Pratama 19 jun. 2017 a las 15:48

Puede usar LEFT JOIN para este propósito como:

reserv r LEFT JOIN company c ON r.idCompany = c.id
1
Keyur Panchal 19 jun. 2017 a las 15:35