2010-03-23 19 views
6

Ho un vecchio tavolo in questo modo:Come aderire tabelle MySQL

user> id | name | address | comments 

E ora ho per creare una tabella di "alias" per consentire ad alcuni utenti di avere un nome alias per alcuni motivi. Ho creato una nuova tabella 'user_alias' in questo modo:

user_alias> name | user 

Ma ora ho un problema a causa del mio povero livello di SQL ... Come unire entrambe le tabelle per generare qualcosa di simile:

1 | my_name | my_address | my_comments 
1 | my_alias | my_address | my_comments 
2 | other_name | other_address | other_comments 

voglio dire, voglio fare una query "SELECT ..." che ritorna nello stesso formato della tabella "utente" tutti gli utenti e tutte alias .. Qualcosa di simile a questo:

SELECT user.* FROM user LEFT JOIN user_alias ON `user`=`id` 

ma doesn lavora per me ..

risposta

2

Qualcosa di simile

SELECT user.name, user.address, user.comment FROM user 
UNION ALL 
SELECT user_alias.alias, user.address, user.comment 
    FROM user INNER JOIN user_alias on user.name = user_alias.name 
ORDER BY name 

si arriva vicino a quello che vuoi.

È necessario UNIONARE due SELECT insieme poiché la soluzione LEFT JOIN proposta da altri includerà solo una riga nel set di risultati per gli utenti con alias, non due come specificato nella domanda.

Ma si dovrebbe rendere la colonna comune che unisce utente e alias la colonna id, non la colonna nome.

+0

Perfetto! Questa è la soluzione. Non so se questo è il migliore, ma funziona! Solo un piccolo errore: SELEZIONA user.name, user.address, user.comment DA utente UNION ALL user_alias.alias SELECT user.address, user.comment DA utente INNER JOIN user_alias su user.id = user_alias. user ORDER BY nome – Ivan

+0

Oh, vedo il tuo JOIN ora. Dovresti rinominare user_alias.user in user_alias.user_id per rendere più chiaro cosa sta succedendo. –

3

Penso che avete bisogno di qualcosa di simile:

SELECT user.* 
FROM user 
LEFT JOIN user_alias 
ON user.name=user_alias.name 

tua query originale non era abbastanza specifico nel condizione di join.

+0

Questo produce solo una singola riga per id = 1, non due come richiesto. –

+0

Sì, non funziona .. – Ivan

+0

Ivan, vedi la mia risposta, di seguito. –

2
SELECT user.* FROM user LEFT JOIN user_alias ON user.name = user_alias.name 
0

Prima di tutto - l'interrogazione si vuole costruire non è banale, perché si sta cercando di ottenere qualche risultato suddiviso tra più di una riga. Quindi ti offrirò una soluzione adeguata in un modo come dovrebbe essere (leggi: in un modo uno sviluppatore di database lo farà :-).

In primo luogo, è necessario modificare la tabella user_alias in modo che contenga la colonna id ma non il nome. Non è una buona idea iscriversi alle tue tabelle utilizzando il campo name. La ragione di questo è che potrebbero esserci due Sarah Connors.

Quindi, è possibile ottenere risultati di entrambe le tabelle usando questa query:

SELECT user.*, user_alias.* 
FROM user LEFT JOIN user_alias 
ON user.id=user_alias.id 

In questo modo si otterrà i risultati in tale formato:

id | name   | address  | comments | user 
------------------------------------------------------------- 
1 | Sarah Connor | Planet Earth | Nice woman | sarah_connor 
2 | Sarah Connor | USA, NY  | Mean woman | sarah_c 
3 | John Connor | USA, NY  | n00b  | john123 

Nelle situazioni in cui ci sono due o più record nel tavolo user_alias per la stessa persona (uguale a id), otterrete qualcosa del genere:

id | name   | address  | comments | user 
------------------------------------------------------------- 
4 | Bill Clinton | White House | President | bill 
4 | Bill Clinton | White House | President | monica 
+0

Il problema è che in situazioni in cui è presente un solo alias su file, si restituirà solo una riga nel set di risultati. Ma l'OP vuole che vengano restituite due righe (la riga utente e una riga separata che combina l'alias da user_alias con l'indirizzo e il commento dalla riga utente corrispondente). –

+0

Più in generale, il problema è che quando ci sono degli alias sul file, non si restituirà la riga unaliased originale dalla tabella utente. –