2011-08-05 43 views
6

Tôi có bảng MYSQL như sauphức tạp tham gia truy vấn

user TABLE {id INT} 

profile TABLE {user_id INT, facebook_id varchar(50)} 

messages TABLE {id INT, message TEXT, from_id INT, type enum('main','facebook'} 

messages_to TABLE {user_id varchar(50), message_id INT} 

profile.user_id REFERS To user.id 
- the messages_to.message_id refers to the messages.ID column. 
- the messages_to.user_id refers to profile.user_id IF messages.type = 'main' BUT 
    if message_type = 'facebook' THEN messages_to.user_id REFERS to profile.facebook_id 

tôi muốn làm một tham gia truy vấn mà về cơ bản sẽ chọn tất cả các tin nhắn đến một người cụ thể, nhưng vấn đề là các messages_to.user_id có thể tham khảo một trong hai the person's facebook ID or the person's ID (a reference to user.id column).

vì vậy, về cơ bản các truy vấn nên làm việc như sau

  • nó nên chọn tất cả các tin nhắn trong thông điệp bảng, và nếu messages.type = 'facebook' kiểm tra nếu messages_to.user_id e quals ID FACEBOOK của người đó. (Lưu ý rằng các cửa hàng bảng messages_to người nhận cho mỗi thông điệp ID)
  • NHƯNG nếu messages.type = 'main' kiểm tra nếu messages_to.user_id bằng với person's USER ID (USER.id)

Có thể làm một mysql join query cho rằng hiệu quả?

tin nhắn_tổng cửa hàng bảng TẤT CẢ người nhận cho từng thư trong bảng MESSAGES. CÓ THỂ THÊM MỘT NGƯỜI TUYỂN DỤNG cho một tin nhắn.

+2

bạn có chắc là bạn cần bảng riêng để lưu trữ facebook_id không? Làm thế nào về có trong bảng người dùng một lĩnh vực facebook_id, có thể là null hoặc có một giá trị. Bất cứ khi nào ai đó tạo tài khoản qua facebook, bạn tạo User on fly với một số tên người dùng ngẫu nhiên (hoặc sử dụng e-mail của facebook) và mật khẩu ngẫu nhiên. Sau đó, bạn luôn có thể sử dụng user_id và nếu bạn có người dùng facebook, trước tiên bạn kiểm tra user_id tương ứng – mkk

Trả lời

2

Tôi đoán đây là truy vấn.

SELECT messages.*,profile.* 
FROM messages 
JOIN messages_to ON messages.id = messages_to.message_id 
JOIN profile ON 
    (profile.user_id = messages_to.user_id AND messages.type = 'main') 
    OR (profile.facebook_id = messages_to.user_id AND messages.type = 'facebook') 
1

điều gì đó tương tự?

select m.*, u.* 
from messages m 
inner join messages_to mt 
on m.id = mt.message_id 
left join profile p 
on (m.type = 'facebook' and mt.user_id = p.facebook_id) 
    or (m.type = 'main' and mt.user_id = p.user_id) 
left join users u 
on p.user_id = u.id 

tại sao bạn có bảng messagesmessages_to được chia nhỏ và không sử dụng một bảng cho mục đích này? (Tôi giả định mối quan hệ 1: 1)

+0

Tôi nghĩ rằng đó là để làm cho tin nhắn có 1 hoặc nhiều người nhận. – ace

+0

ace: hm, có ý nghĩa :) nhưng sau đó tôi sẽ đổi tên bảng thành 'recipient' – knittl

+0

vâng, tôi tin rằng đó sẽ là thuật ngữ tốt nhất. – ace

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