2010-03-23 35 views
6

Tôi đã một bảng cũ như thế này:Làm thế nào để tham gia bảng mysql

user> id | name | address | comments 

Và bây giờ tôi đã tạo ra một "bí danh" bảng để cho phép một số người dùng có một cái tên bí danh cho một số lý do. Tôi đã tạo một bảng 'user_alias' mới như thế này:

user_alias> name | user 

Nhưng bây giờ tôi có một vấn đề do mức SQL nghèo của tôi ... Làm thế nào để tham gia cả hai bảng để tạo ra một cái gì đó như thế này:

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

Ý tôi là, tôi muốn thực hiện một truy vấn "SELECT ..." trả về trong các định dạng tương tự như bảng "user" TẤT CẢ người dùng và TẤT CẢ alias .. một cái gì đó như thế này:

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

nhưng nó doesn 't làm việc cho tôi ..

Trả lời

2

Một cái gì đó như

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 

sẽ giúp bạn gần gũi với những gì bạn muốn.

Bạn cần UNION hai SELECT cùng nhau vì giải pháp LEFT JOIN được đề xuất bởi người khác sẽ chỉ bao gồm một hàng trong tập hợp kết quả cho người dùng có bí danh, không phải hai như được chỉ định trong câu hỏi của bạn.

Nhưng bạn nên làm cho cột chung tham gia người dùng và bí danh cột id, không phải cột tên.

+0

Hoàn hảo! Đây là giải pháp. Tôi không biết nếu điều này là tốt nhất, nhưng nó hoạt động! Chỉ một sai lầm nhỏ: CHỌN người dùng.name, user.address, user.comment TỪ người dùng UNION ALL SELECT user_alias.alias, user.address, user.comment TỪ người dùng INNER JOIN user_alias trên user.id = user_alias. người dùng ORDER BY name – Ivan

+0

Ồ, tôi thấy THAM GIA của bạn ngay bây giờ. Bạn nên đổi tên user_alias.user thành user_alias.user_id để làm cho nó rõ ràng hơn những gì đang diễn ra. –

3

tôi nghĩ rằng bạn cần một cái gì đó như thế này:

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

truy vấn ban đầu của bạn không đủ cụ thể trong điều kiện join.

+0

Điều này chỉ tạo một hàng duy nhất cho id = 1, không phải hai hàng như được yêu cầu. –

+0

Có, không hoạt động .. – Ivan

+0

Ivan, xem câu trả lời của tôi, bên dưới. –

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

Trước hết - truy vấn bạn muốn tạo không quan trọng, vì bạn đang cố gắng thu được một số kết quả trải dài trên nhiều hàng. Vì vậy, tôi sẽ cung cấp cho bạn một giải pháp thích hợp trong một thời trang như nó phải được (đọc: trong một cách một nhà phát triển cơ sở dữ liệu sẽ làm điều này :-).

Trước tiên, bạn nên sửa đổi bảng user_alias để nó chứa cột id nhưng không phải tên. Bạn không nên tham gia các bảng của mình bằng cách sử dụng trường name. Lý do cho điều này là có thể có hai Sarah Connors.

Sau đó, bạn có thể nhận được kết quả từ hai bảng sử dụng truy vấn này:

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

Bằng cách này bạn sẽ nhận được kết quả của bạn ở định dạng như:

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 

Trong các tình huống khi có hai hoặc nhiều hồ sơ trong user_alias bảng cho cùng một người (bằng id 's), bạn sẽ nhận được một cái gì đó như thế này:

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

Vấn đề là trong trường hợp chỉ có một bí danh trên tệp, bạn sẽ chỉ trả lại một hàng trong tập kết quả. Nhưng OP muốn hai hàng được trả lại (hàng người dùng và một hàng riêng biệt kết hợp bí danh từ user_alias với địa chỉ và nhận xét từ hàng người dùng phù hợp). –

+0

Nói chung, vấn đề là khi có bất kỳ bí danh nào cả trên tệp, bạn sẽ không trả lại hàng không bị lệch ban đầu từ bảng người dùng. –

Các vấn đề liên quan