2012-06-08 10 views
5

Mi piace usare i nomi esplicativi per le selezioni associative e talvolta è anche obbligatorio evitare i duplicati, quindi uso la parola chiave AS molto. Ma mi sta dando dei problemi con i join di sinistra.MySQL left join che non funziona con la parola chiave AS

Questo funziona:

$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"; 

Comunque ora io alla fine con dati inutili da projects, perché riprende anche i campi userID e name, che non ho bisogno. Raccoglie anche l'ID due volte.

Così ho provato a cambiarlo;

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

con la linea sul diventare

" ON projects_id = projectfiles_projectID"; 

Ma che ha dato l'errore Unknown column projects_id

Così ho provato

" ON projects.projects_id = projectfiles_projectID"; 

Ma ancora

ho lo stesso errore poi ha iniziato a sperimentare, e ha cercato (come test)

$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"; 

e con mia sorpresa, il LEFT JOIN non sembrava raccogliere nulla.

Codice:

$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++; 
    } 
} 

uscita:

problem

che è strano perché c'è solo una riga in projects ma 3 in projectfiles con quella ProjectID ... cosa faccio di sbagliato ?

+0

Uso istanza del nome di colonna in condizione ON e durante la selezione anche, darà tu correggi la soluzione. Non c'è bisogno di complicare usando AS. Mostra alcuni dati campione e richiesti o/p. –

+0

Qual è il tuo output previsto? –

+0

Vuoi un singolo record con la tabella Progetti, quindi usa DISTINCT. –

risposta

1

Per selezionare solo dalla projectfiles tavolo:

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

// rest of the code is the same 

Aggiornamento

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

Fantastico, grazie! – natli

+0

@natli sei il benvenuto :) inizialmente non pensavo sarebbe stato così facile hehe –

1

Utilizza il modulo breve della query:

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

Non ha funzionato, ho ancora 3 file da progetti senza dati dal join sinistro. – natli

+0

Hai modificato la tua risposta. Non voglio utilizzare il modulo breve perché voglio utilizzare la parola chiave AS su tutti i dati recuperati. – natli

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

è possibile utilizzare "come" di fare come si vuole allora. Non c'è bisogno di una sottoselezione.

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

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

Penso tu voglia dire "ON p.id = pf.projectID"; '? E non ha funzionato, ho ancora 3 file da progetti senza dati dal join di sinistra. – 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";