2013-07-18 8 views
12

Ho due tavoli. Uno per utenti e uno per post. La tabella utenti ha i seguenti campi:PHP/MySQL: ottenere più colonne con lo stesso nome nella query di join senza alias?

id, username, password, created_at, modified_at 

La tabella messaggi ha i seguenti campi:

id, user_id, title, body, created_at, modified_at 

Quando uso una query come:

SELECT * FROM `users` LEFT OUTER JOIN `posts` ON users.id=posts.user_id 

a prendere i risultati utilizzando DOP:

$sth = $this->$default_connection->prepare($query); 
$sth->execute(); 
$sth->fetchAll(PDO::FETCH_ASSOC); 

La matrice restituita sovrascrive tutte le colonne con gli stessi nomi come id, created_at, modified_at simili:

Array 
(
    [0] => Array 
     (
      [id] => 1 
      [username] => johnSmith 
      [password] => 2348r7edf8s79aa0230 
      [created_at] => 0000-00-00 00:00:00 
      [modified_at] => 0000-00-00 00:00:00 
      [user_id] => 18 
      [title] => First Post 
      [body] => Just testing... 
     ) 
) 

Il campo id per l'utente non è mostrato, invece sovrascritti dal id del post. Lo stesso vale per i campi created_at & modified_at.

credo posso risolvere questo problema sia usando pseudonimi o qualcosa di simile a questo:

SELECT 
     users.id, 
     users.username, 
     users.password, 
     users.created_at, 
     users.modified_at, 
     posts.id AS postId, 
     posts.user_id, 
     posts.title, 
     posts.created_at AS postCreatedAt, 
     posts.modified_at AS postModifiedAt 
    FROM `users` 
     LEFT OUTER JOIN `posts` ON (users.id=postId) 

o qualcosa di simile, ma mi chiedevo se ci fosse un modo per farlo senza scrivere manualmente il nome di ogni singola colonna o un alias per ogni volta che voglio distinguere tra due colonne con lo stesso nome? E 'possibile fare qualcosa di simile:

SELECT users.* AS User and posts.* AS Post from `users` LEFT OUTER JOIN ON (User.id=Post.user_id) 

e farlo utilizzare automaticamente gli alias per ogni colonna? Oppure c'è un altro modo più veloce/più conveniente per farlo? Oppure posso farlo senza dover definire alcun alias da solo?

Grazie

risposta

4

penso alias è perfetto in questo caso

SELECT table1.column AS column1, table2.column AS column2 
FROM table1 
LEFT JOIN table2 
ON table1.column = table2.column 

Per risparmiare tempo di digitazione, alias di tabella uso:

SELECT t1.column AS column1, t2.column AS column2 
FROM table1 AS t1 
LEFT JOIN table2 AS t2 
ON t1.column = t2.column 
+1

Grazie per la tua risposta! Mi stavo chiedendo però se ci fosse un modo per farlo senza definire alias? – randomphp

+4

Non sono sicuro del motivo per cui questo è contrassegnato come risposta accettata, offre una soluzione che è già stata menzionata nella domanda e la domanda chiedeva specificamente una soluzione _differente_. La risposta di Bill Karwin è molto più utile. – Niall

7

L'unico modo per farlo senza definire alias è recuperare le righe indicizzate per posizione di colonna anziché per nome colonna:

$sth->fetchAll(PDO::FETCH_NUM); 

Si potrebbe anche ridurre il lavoro alle colonne alias alias solo le colonne che ne hanno bisogno:

SELECT *, posts.created_at AS postCreatedAt, posts.updated_at AS postUpdatedAt 
FROM `users` LEFT OUTER JOIN `posts` ON users.id=posts.user_id 

Tuttavia, è generalmente considerato una cattiva idea di utilizzare SELECT * nel codice di produzione in ogni caso. In genere non è necessario tutte le colonne, quindi è sufficiente recuperare quelle necessarie. Questo riduce inutili sprechi di larghezza di banda durante il recupero dei risultati.

0

U può aggiungere lo stesso nome qualificato dopo campi ambiguo (uso tildas o virgole)

SELECT 
    users.id `users.id`, 
... 
    posts.id `posts.id`, 
... 
FROM `users` 
    LEFT OUTER JOIN `posts` ON (users.id=posts.id)