2011-08-22 18 views
5

Ho una situazione in cui una tabella delle proprietà contiene un ID indirizzo (dalla tabella g_addresses) e una tabella richiedente anche contiene un ID indirizzo da g_addresses. Vorrei lasciare unire questi insieme ma selezionare tutti i campi nella tabella.Mysql - Come alias un'intera tabella in un join di sinistra

So di utilizzare "come" per creare un alias per i campi, ma esiste un modo per produrre un alias per un intero tavolo?

SELECT * 
FROM (`reference`) 
LEFT JOIN `applicants` ON `applicants`.`id` = `reference`.`applicant_id` 
LEFT JOIN `g_people` applicant_person ON `applicant_person`.`id` = `applicants`.`person_id` 
LEFT JOIN `g_addresses` applicant_address ON `applicant_address`.`id` = `applicants`.`address_id` 
LEFT JOIN `properties` ON `properties`.`id` = `reference`.`property_id` 
LEFT JOIN `g_addresses` property_address ON `property_address`.`id` = `properties`.`address_id` 
WHERE `reference`.`id` = 4 

Questo produce un risultato contenente una sola riga indirizzo e non entrambi, La riga restituita è la riga dalla finale aderire e non quello precedentemente, indica che sovrascrive quando viene restituito.

+3

come opere per le tabelle pure . – Cfreak

risposta

11

Non credo che si dovrebbe usare i riferimenti mascherati, come * o `reference`.*, nel tuo caso, perché si può finire con una serie riga contenente colonna identici nomi (id, address_id).

Se si vuole tirare tutte le colonne dalle tabelle unite, probabilmente si dovrebbe specificare individualmente nella clausola SELECT e assegnare un alias unico per ognuno di loro:

SELECT 
    ref.`id` AS ref_id, 
    ref.`…` AS …, 
    … 
    app.`id` AS app_id, 
    … 
FROM `reference` AS ref 
LEFT JOIN `applicants` AS app ON app.`id` = ref.`applicant_id` 
LEFT JOIN `g_people` AS ape ON ape.`id` = app.`person_id` 
LEFT JOIN `g_addresses` AS apa ON apa.`id` = app.`address_id` 
LEFT JOIN `properties` AS pro ON pro.`id` = ref.`property_id` 
LEFT JOIN `g_addresses` AS pra ON pra.`id` = pro.`address_id` 
WHERE ref.`id` = 4 
+0

Grazie, l'ho usato per la mia soluzione finale! – Anthony

+2

+1 per l'uso di apici inversi –

1

essere più preciso circa le colonne si seleziona

SELECT 
    applicant_address.*, 
    property_address.*, 
    applicants.*, 
    applicant_person.*, 
    properties.* 
FROM (`reference`) 
LEFT JOIN `applicants` ON `applicants`.`id` = `reference`.`applicant_id` 
LEFT JOIN `g_people` applicant_person ON `applicant_person`.`id` = `applicants`.`person_id` 
LEFT JOIN `g_addresses` applicant_address ON `applicant_address`.`id` = `applicants`.`address_id` 
LEFT JOIN `properties` ON `properties`.`id` = `reference`.`property_id` 
LEFT JOIN `g_addresses` property_address ON `property_address`.`id` = `properties`.`address_id` 
WHERE `reference`.`id` = 4 
+0

Mi piacerebbe selezionare ogni singola colonna da ogni tabella - potrebbe sembrare eccessivo, ma in questa situazione è necessario! In altre parole, un modo per farlo senza digitare il nome di ogni singola colonna? C'è circa 85 tutti insieme. Apprezzo il rapido feedback. – Anthony

+0

@Anthony vedi sopra, usa 'tablename. *' Per ogni alias di tabella –

Problemi correlati