2011-07-22 37 views
5
table a 
------------------------------------------------- 
id name  wishlist1 wishlist2  wishlist3 

1 john  1    2   3 
2 paul  4    5 


table b 
-------------------------------------------------- 
id goods 

1  car 
2  aircraft 
3  bicycle 
4  motorbike 
5  ipad 


result i want to get 
--------------------------------------------------- 
john car  aircraft bicycle 
paul motorbike ipad 

Tôi có thể nhận kết quả này bằng cách nào? (trong mysql)mysql join problem

+0

tất cả các câu trả lời là đủ cho vấn đề của bạn. Hy vọng Bây giờ tham gia là rõ ràng cho bạn ......! –

Trả lời

5

này kết quả đầu ra lên đến 3 điều ước (với null trong cột mong muốn khi họ không có một mong muốn)

select 
    name, 
    g1.goods as wish1, 
    g2.goods as wish2, 
    g3.goods as wish3 
from tablea a 
left join tableb g1.id on g1.wishlist1 
left join tableb g2.id on g1.wishlist2 
left join tableb g3.id on g1.wishlist3 

Điều này có thể tốt hơn mặc dù, và nó gọn gàng hơn, nếu bạn không nhớ một danh sách dấu phẩy phân cách của những lời chúc:

select 
    name, 
    group_concat(goods) as wishes 
from tablea a 
left join tableb b on b.id in (a.wishlist1, a.wishlist2, a.wishlist3) 
group by name; 

đó sẽ ra:

name | wishes 
------|---------------------- 
john | car,aircraft,bicycle 
paul | motorbike,ipad 
3

Đây không phải là thiết kế DB tốt.

Bạn nên tạo một bảng intermadiary như:

table a_b 
----------- 
id_a int 
id_b int 

theo cách này bạn sẽ mô hình thành công là mối quan hệ n, do đó người dùng có thể có nhiều yếu tố trong danh sách mong ước của mình và một yếu tố để xuất hiện trong nhiều danh sách mong muốn

+0

Tôi cho rằng bạn chưa thử ... – gbn

+0

@gbn - bạn nói đúng - tôi chưa thử - truy vấn của bạn là đúng - mặc dù, anh ta có thể xem xét lời khuyên cho việc thiết kế lại db –

3
SELECT 
    a.name, 
    b1.goods, 
    b2.goods, 
    b3.goods 
FROM 
    a 
    LEFT JOIN 
    b AS b1 ON a.wishlist1 = b1.id 
    LEFT JOIN 
    b AS b2 ON a.wishlist2 = b2.id 
    LEFT JOIN 
    b AS b3 ON a.wishlist3 = b3.id 

Nếu bạn luôn có 3 mục trong danh sách yêu thích, thì đây chỉ là về OK. Nếu bạn muốn mở rộng số lượng mặt hàng mong muốn, thì bạn nên tốt hơn với một bảng riêng biệt và lưu trữ dưới dạng hàng. Xem First Normal Form

3

Đó thường là một ý tưởng tồi. Tôi đề nghị cơ cấu lại bảng của bạn như sau:

person 
pid name 
--- ---- 
1 john 
2 paul 

good 
gid item 
--- --------- 
1 car 
2 aircraft 
3 bicycle 
4 motorbike 
5 ipad 

person_wants_good 
pid gid 
--- --- 
1 1 
1 2 
1 3 
2 4 
2 5 

Sau đó, để có được kết quả mong muốn, sử dụng các truy vấn sau đây:

SELECT p.name, g.good 
    FROM person_wants_good 
    JOIN person USING (pid) 
    JOIN good USING (gid) 

này sẽ trở lại với bảng sau:

name good 
---- --------- 
john car 
john aircraft 
john bicycle 
paul motorbike 
paul ipad 

Sau đó, mã của khách hàng của bạn hiển thị thông tin này theo cách được phân tách chéo.