2011-08-05 46 views
6

tengo las tablas de MySQL de la siguiente maneracompleja consulta de combinació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 

Quiero hacer una consulta que, básicamente, se seleccionan todos los mensajes a una persona específica se unen, pero la cosa es la messages_to.user_id puede hacer referencia a the person's facebook ID or the person's ID (a reference to user.id column).

Así que, básicamente, la consulta debería funcionar de la siguiente manera

  • se debe seleccionar todos los mensajes en la tabla de mensajes, y si messages.type = 'facebook' comprueba si messages_to.user_id correo quals la identificación de FACEBOOK de la persona. (Tenga en cuenta que las tiendas de mesa messages_to los destinatarios para cada mensaje ID)
  • pero si el messages.type = 'main' comprueba si el messages_to.user_id es igual a la person's USER ID (USER.id)

¿Es posible hacer un mysql join query para que de manera eficiente?

La tabla messages_tos almacena TODOS los destinatarios de cada mensaje en la tabla MENSAJES. PUEDE HABER MÁS DE UN RECEPTOR por un mensaje.

+2

¿Estás seguro de que necesitas una mesa para almacenar facebook_id? ¿Qué tal tener en la tabla de Usuario un campo facebook_id, que puede ser nulo o tiene un valor? Cada vez que alguien crea una cuenta a través de Facebook, crea User on fly con un nombre de usuario aleatorio (o usa el correo electrónico de Facebook) y una contraseña aleatoria. Entonces siempre puede usar user_id y si tiene un usuario de Facebook, primero verifica el user_id correspondiente – mkk

Respuesta

2

Supongo que esta es la consulta.

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

algo así?

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 

¿Por qué tienen sus messages y messages_to tablas se separan y no utilizan una sola tabla para esto? (Estoy asumiendo una relación 1: 1)

+0

. Creo que es para que los mensajes tengan 1 o más destinatarios. – ace

+0

ace: hm, tiene sentido :) pero luego cambiaría el nombre de la tabla a 'recipients' – knittl

+0

sí, creo que sería el mejor término. – ace

Cuestiones relacionadas