具有多个表和外键的Mysql查询

时间:2015-03-09 11:32:27

标签: php mysql social-networking

考虑这个mysql表结构(对于存储private/group聊天消息很有用):

USERS
user_id
username
password

GROUPS (= DISCUSSIONS / TOPICS)
group_id
name

GROUPS_MEMBERS (= MEMBERS OF A SPECIFIC DISCUSSION / TOPIC)
group_id
user_id

MESSAGES
message_id
timestamp
from_user_id
destination_type (enum - group, user)
destination_id

请您帮我查询一下,以检索特定用户活跃的5个最近的讨论(私人或群组)的列表?

重要:

我没有实际代码,因为我只是决定如何构建数据库表。上面提到的table structure非常明显(destination_id是对group_id的引用,而group members是将收到消息的所有users。最后,发送的所有消息在特定群组的用户之间建立discussiontopic)。

这就是我想做的事情(这很容易......不要过度思考......就像Facebook或Gmail之类的聊天/短信系统一样)。

当用户logs in并打开聊天时,他当然会看到他/她所属的所有最新discussion。按时间顺序排列DESC

所以我需要编写查询以按时间顺序DESC顺序检索最新的5个GROUP_ID(=讨论)。但只有登录用户所参与的讨论。(当然我有登录用户的ID ...例如16)

P.S。我自己没有构建这个表结构,但它似乎是逻辑;唯一的问题是上面提到的问题。

2 个答案:

答案 0 :(得分:0)

@Igor Carmagna:

我已经解决了你的问题并根据我认为你需要列出最终用户留下的前5条消息吗?因此,请按照以下步骤进行操作。

1)首先,你需要做的就是加入。 2)在此步骤中,您需要使用max()函数,该函数将根据收到的消息提供用户列表。现在,根据你的问题,你需要只有前5个记录,所以你被绑定使用(max-5)函数这将给出前5个记录

希望这会让你成为一天! 干杯:):P

答案 1 :(得分:0)

这是我的建议。您可以使用DISTINCT获取不同的记录,并使用LIMIT仅获取五条记录。您可以使用登录ID替换logged_in_user_id

SELECT DISTINCT GROUPS.group_id FROM USERS
  JOIN GROUP_MEMBERS ON USERS.user_id = GROUP_MEMBERS.user_id
  JOIN GROUPS ON GROUPS.group_id = GROUP_MEMBERS.group_id
  JOIN MESSAGES ON destination_type = 'group' AND destination_id = GROUPS.group_id
  WHERE USERS.user_id = logged_in_user_id
  ORDER BY timestamp DESC
  LIMIT 5;