【问题标题】:complex join query复杂的连接查询
【发布时间】:2011-10-21 00:20:09
【问题描述】:

我的MYSQL表如下

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

我想做一个连接查询,基本上选择所有给特定人的消息,但问题是 messages_to.user_id 可以参考the person's facebook ID or the person's ID (a reference to user.id column).

所以基本上查询应该如下工作

  • 它应该选择消息表中的所有消息,如果messages.type = 'facebook' 检查messages_to.user_id 是否等于该人的FACEBOOK ID。 (请注意,messages_to 表存储每个消息 ID 的收件人)
  • 但是如果messages.type = 'main' 检查messages_to.user_id 是否等于person's USER ID (USER.id)

是否有可能为此有效地执行mysql join query

messages_tos 表将每条消息的所有收件人存储在 MESSAGES 表中。一条消息的接收者可能不止一个。

【问题讨论】:

  • 您确定需要单独的表来存储 facebook_id 吗?在用户表中有一个字段 facebook_id 怎么样,它可以是 null 也可以有一个值。每当有人通过 facebook 创建帐户时,您都会使用一些随机用户名(或使用 facebook 的电子邮件)和随机密码即时创建用户。然后你总是可以使用 user_id,如果你有 facebook 用户,你首先检查相应的 user_id

标签: php mysql mysql5


【解决方案1】:

我猜这是查询。

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')  

【讨论】:

    【解决方案2】:

    类似的东西?

    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
    

    为什么您将messagesmessages_to 表分开而不使用单个表? (我假设是 1:1 的关系)

    【讨论】:

    • 我认为是让消息有1个或多个收件人。
    • ace: 嗯,有道理 :) 但随后我会将表格重命名为 recipients
    猜你喜欢
    • 2010-11-02
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多