2012-06-08 20 views
5

Me gusta usar nombres de autoexplicación para selecciones asociativas, y en ocasiones incluso es obligatorio evitar duplicados, así que uso mucho la palabra clave AS. Pero me está dando problemas con las combinaciones de la izquierda.MySQL left join no funciona con la palabra clave AS

Esto funciona:

$sql = "SELECT *, 
     projects.id as projects_id 
     FROM projects"; 

$sql .= " LEFT JOIN". 
    " (SELECT 
     projectfiles.id as projectfiles_id, 
     projectfiles.fileID as projectfiles_fileID, 
     projectfiles.projectID as projectfiles_projectID 
     FROM projectfiles 
     ) AS projectfiles". 
    " ON projects.id = projectfiles_projectID"; 

Sin embargo, ahora termino con datos inútiles de projects, ya que también recoge los campos userID y name, que no necesito. También está recogiendo la identificación dos veces.

Así que traté de cambiarlo;

$sql = "SELECT 
     projects.id as projects_id 
     FROM projects"; 

con la línea de convertirse en

" ON projects_id = projectfiles_projectID"; 

Pero que dio el error Unknown column projects_id

Así que traté

" ON projects.projects_id = projectfiles_projectID"; 

Pero sigue siendo el mismo error

I luego comenzó a experimentar, y trató (como prueba)

$sql = "SELECT id,name,userID FROM projects"; 

$sql .= " LEFT JOIN". 
    " (SELECT 
     projectfiles.id as projectfiles_id, 
     projectfiles.fileID as projectfiles_fileID, 
     projectfiles.projectID as projectfiles_projectID 
     FROM projectfiles 
     ) AS projectfiles". 
    " ON projects.id = projectfiles_projectID"; 

Y para mi sorpresa, la combinación izquierda no parecía para recoger nada en absoluto.

Código:

$sql = "SELECT id,name,userID FROM projects"; 

$sql .= " LEFT JOIN". 
    " (SELECT 
     projectfiles.id as projectfiles_id, 
     projectfiles.fileID as projectfiles_fileID, 
     projectfiles.projectID as projectfiles_projectID 
     FROM projectfiles 
     ) AS projectfiles". 
    " ON projects.id = projectfiles_projectID"; 

$res = mysql_query($sql); 
if(!$res) die(mysql_error()); 

if(mysql_num_rows($res) > 0) 
{ 
    $rownum = 0; 
    while($row = mysql_fetch_assoc($res)) 
    { 
     print_r($row); 
     echo "<br/><br/>"; 
    $rownum++; 
    } 
} 

Salida:

problem

lo cual es raro porque sólo hay una fila de projects pero 3 en projectfiles con ese projectId ... ¿qué estoy haciendo mal ?

+0

Uso instancia del nombre de la columna en estado ON y mientras que la selección también, se le dará corriges la solución No necesita complicarse usando AS. Muestre algunos de sus datos de muestra y requiera o/p. –

+0

¿Cuál es su resultado esperado? –

+0

¿Desea un solo registro con la tabla Projects y luego utilice DISTINCT. –

Respuesta

1

Para seleccionar sólo desde la mesa projectfiles:

$sql = "SELECT projectfiles.*, 
     projects.id as projects_id 
     FROM projects"; 

// rest of the code is the same 

actualización

$sql = "SELECT projectfiles.* FROM projects"; 
// rest of the code is the same 
+0

¡Impresionante, gracias! – natli

+0

@natli de nada :) originalmente no pensé que sería tan fácil jeje –

1

Uso forma corta de la consulta:

$sql = "SELECT projects.id,projects.name,projects.userID FROM projects LEFT JOIN 
     projectfiles ON projects.id = projectfiles.projectID"; 
+0

No funcionó, todavía tengo 3 filas de proyectos sin datos de la combinación de la izquierda. – natli

+0

Editó su respuesta. No quiero usar el formulario corto porque quiero usar la palabra clave AS en todos los datos recuperados. – natli

1
SELECT p.*, pf.id, pf.fileId 
FROM projects p LEFT JOIN projectfiles pf 
on p.id = pf.projectID 

puede utilizar "como" hacer lo que se quiere entonces. No hay necesidad de una subselección.

0
$sql = "SELECT p.id,p.name,p.userID FROM projects p"; 

$sql .= " LEFT JOIN". 
    " projectfiles pf ". 
    " ON p.id = p.projectID"; 
+0

Creo que te refieres a '" ON p.id = pf.projectID ";'? Y no funcionó, todavía recibo 3 filas de proyectos sin datos de la combinación de la izquierda. – natli

0
$sql = "SELECT prj.id as prjId, 
    prj.name as prjName, 
    prj.userID as prjUid, 
    pf.id as pfId, 
    pf.fileID as pfFileId, 
    pf.projectID as pfProjecId 
FROM projects as prj 
LEFT JOIN projectfiles AS pf 
ON prj.id = pf.projectID";