2011-08-05 12 views
6

mam tabel MySQL następującokompleks dołączyć zapytanie

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 

chcę zrobić dołączyć zapytanie, które w zasadzie wybiera wszystkie wiadomości do konkretnej osoby, ale rzecz jest messages_to.user_id może odnosić się zarówno the person's facebook ID or the person's ID (a reference to user.id column).

Więc w zasadzie kwerenda powinien działać następująco

  • należy zaznaczyć wszystkie wiadomości w wiadomościach tabeli, a jeśli messages.type = 'facebook' sprawdza czy messages_to.user_id e powoduje skasowanie identyfikatora FACEBOOK danej osoby. (Należy pamiętać, że sklepy stół messages_to odbiorców dla każdej wiadomości ID)
  • ale jeśli messages.type = 'main' sprawdza, czy messages_to.user_id równa person's USER ID (USER.id)

Czy to możliwe, aby zrobić mysql join query za to skutecznie?

Tabela Totemy-wiadomości zawiera WSZYSTKICH odbiorców dla każdej wiadomości w tabeli KOMUNIKATY. MOGĄ BYĆ WIĘCEJ NIŻ JEDEN ODBIORCY dla wiadomości.

+2

Czy na pewno potrzebujesz osobnej tabeli do przechowywania danych facebook_id? A może w tabeli użytkownika pole facebook_id, które może mieć wartość zerową lub ma wartość. Za każdym razem, gdy ktoś tworzy konto za pośrednictwem Facebooka, tworzysz użytkownika w locie z pewną losową nazwą użytkownika (lub korzystasz z e-maila na Facebooku) i losowym hasłem. Wtedy zawsze możesz użyć user_id, a jeśli masz Facebooka, najpierw sprawdzasz odpowiedni user_id – mkk

Odpowiedz

2

Domyślam się, że to jest zapytanie.

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

coś w tym stylu?

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 

dlaczego masz twoi messages i messages_to tabele podzielone i nie korzystać z jednego stołu do tego? (zakładam stosunek 1: 1)

+0

Myślę, że to sprawia, że ​​wiadomości mają jednego lub więcej odbiorców. – ace

+0

As: hm, ma sens :) ale wtedy zmieniłbym nazwę tabeli na 'adresatów' – knittl

+0

tak, wierzę, że byłby to najlepszy termin. – ace

Powiązane problemy