Mysql 多表多外键查询

Mysql query with multiple tables and foreign keys

考虑这个 mysql tables 结构(用于存储 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 个讨论(私人或群组)的列表吗?

重要提示:

我没有实际的代码,因为我只是在决定如何构建数据库 tables。上面显示的 table structure 是不言自明的(destination_id 是对 group_id 的引用,而 group members 是将接收消息的所有 users。最后, 特定组的用户之间发送的所有消息都构成 discussiontopic)。

这就是我想要做的(这很容易......不要想太多......它就像任何 chat/messaging 系统,如 Facebook 或 Gmail 等)。

当用户 logs in 打开聊天时,他当然会看到他 is/has 参与过的所有最新 discussion。按时间 DESC 顺序排列。

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

P.s。我没有自己构建这个 table 结构,但它看起来合乎逻辑;唯一的问题是上面提到的问题。

@Igor Carmagna:

我已经回答了你的问题,据此我认为你需要列出最终用户留下的前 5 条消息,对吧?。因此,请按照以下给定的步骤操作。

1) 首先,您需要做的大部分事情就是加入。 2) 在此步骤中,您需要使用 max() 函数,该函数将根据收到的消息为您提供用户列表。现在,根据您的问题,您只需要前 5 条记录,因此您必须使用 (max-5) 函数,这将给出前 5 条记录

希望这会让你开心!! 干杯 :) :P

这是我的建议。您可以使用 DISTINCT 获取不同的记录,使用 LIMIT 只能获取 5 条记录。您可以将 logged_in_user_id 替换为登录 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;