2010-11-22 35 views
6

Tôi có 2 bảng có tên useruserFriend. Tôi muốn tất cả người dùng từ bảng người dùng và thành viên cụ thể từ bảng userFriend. Sau đó, tôi muốn tham gia cả trong số họ ...cách viết điều kiện tham gia trái

user 
userID userName 
1   aaa 
2   bbb 
3   ccc 
4   ddd 
5   eee 

userFriend 
userFriendID userID friendUserID 
1    1  2 
2    2  3 
3    1  4 
4    4  2 

Vì vậy, nếu userID của tôi = 1, sau đó tôi muốn kết quả như

userID userName userFriendID friendUserID  
2   bbb  1   2 
3   ccc  NULL  NULL 
4   ddd  3   4 
5   eee  NULL  NULL 

vì vậy theo cách này, tôi muốn có điều kiện cho bảng thứ 2, tôi chỉ muốn tham gia bảng thứ hai có userID = 1 với bảng 1 bằng cách sử dụng tham gia trái.

+0

Bạn có thể bố cục mã của mình tốt hơn một chút không (sử dụng trợ giúp định dạng). Tại thời điểm này có vẻ như bạn có userID, userFriendID và friendUserID, trong khi tôi tin rằng bạn chỉ cần hai ID. – Gidon

+0

Bạn có thể vui lòng đăng datamodel của mình không? Tôi tin rằng một yêu cầu như vậy ngụ ý rằng có một vấn đề ở đó thay vào đó. –

+0

xem http://stackoverflow.com/questions/1255492/conditional-join-in-mysql – Singleton

Trả lời

0

Đối với những gì bạn muốn, bạn không cần truy vấn từ cả hai bảng. Chỉ cần sử dụng userFriend sẽ cung cấp cho bạn dữ liệu. Bạn sẽ cần bảng người dùng chỉ cho các tên.

SELECT DISTINCT userID FROM userFriend 
WHERE friendUserID = ? 

điều này sẽ cung cấp cho bạn tất cả người dùng có người bạn cụ thể mà bạn cần. Tùy chọn bạn có thể thêm một INNER JOIN để xem những gì các tên:

SELECT DISTINCT f.userID, u.name 
FROM userFriend f 
INNER JOIN users u ON u.userID = f.userID 
WHERE friendUserID = ? 

CẬP NHẬT Một nhận xét về cấu trúc của bạn. Bạn không cần userFriendID. Sự kết hợp giữa ID người dùng và ID người bạn có thể là chìa khóa của bạn.

CẬP NHẬT của truy vấn

SELECT * FROM users u 
LEFT JOIN userFriend f on u.userID = f.userID 
WHERE f.friendUserID = ? 

này sẽ trả lại cho bạn tất cả những người dùng có sự X. friend Các trái tham gia không phải là quan trọng trong việc truy vấn này. Điều kiện cụ thể này làm cho nó không liên quan.

Để có được chính xác những gì bạn muốn, bạn cần thực hiện việc này.

SELECT * FROM users u 
LEFT JOIN (
    SELECT DISTINCT * FROM userFriend f 
    WHERE friendID = 4 
) x ON u.id = x.userId 

Có thể thực hiện bằng truy vấn phụ nhưng tôi không nghĩ là cách tổ chức bảng hợp lý nhất.

4

Đó là một điều độc đáo để yêu cầu ... nhưng điều này mang đến cho bạn kết quả mong muốn.

SELECT u.userID, u.userName, uf.userFriendID, uf.friendUserID 
FROM user u 
LEFT JOIN userFriend uf ON u.userID = uf.friendUserID AND uf.userID =1 
WHERE u.userID !=1 
Các vấn đề liên quan