2011-08-22 21 views
5

Tôi có một tình huống trong đó bảng thuộc tính chứa id địa chỉ (từ bảng g_addresses) và bảng đăng ký cũng giữ id địa chỉ từ g_addresses. Tôi muốn tham gia cùng nhau nhưng chọn tất cả các trường trong bảng.Mysql - Làm cách nào để đặt bí danh toàn bộ bảng trong một kết nối bên trái

Tôi biết sử dụng 'as' để tạo bí danh cho các trường, nhưng có cách nào để tạo bí danh cho toàn bộ bảng không?

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 

này tạo ra một kết quả chỉ chứa một hàng địa chỉ và không được cả hai, Hàng được trả về là hàng từ trận chung kết tham gia và không phải là người trước đó, cho thấy nó được ghi đè khi nó được trả về.

+3

AS công trình cho các bảng cũng . – Cfreak

Trả lời

11

Tôi không nghĩ rằng bạn nên sử dụng tài liệu tham khảo đeo mặt nạ, giống như * hoặc `reference`.*, trong trường hợp của bạn, bởi vì bạn có thể kết thúc với một bộ hàng chứa cột giống hệt nhau tên (id, address_id).

Nếu bạn muốn kéo tất cả các cột từ các bảng tham gia, có lẽ bạn nên xác định chúng riêng rẽ trong mệnh đề SELECT và gán một bí danh duy nhất cho mỗi một trong số họ:

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

Cảm ơn, tôi đã sử dụng điều này cho giải pháp cuối cùng của mình! – Anthony

+2

+1 để sử dụng backticks –

1

Hãy cụ thể hơn về các cột bạn chọn

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

Tôi muốn chọn từng cột đơn từ mọi bảng - có thể nghe có vẻ quá mức cần thiết nhưng trong trường hợp này, điều đó là cần thiết! Nói cách khác - bất kỳ cách nào để làm điều đó mà không cần gõ từng tên cột? Có khoảng 85 tất cả cùng nhau. Tôi đánh giá cao phản hồi nhanh chóng. – Anthony

+0

@Anthony xem ở trên, sử dụng 'tablename. *' Cho mỗi bí danh bảng –