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
。最后, 特定组的用户之间发送的所有消息都构成 discussion
或 topic
)。
这就是我想要做的(这很容易......不要想太多......它就像任何 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;
考虑这个 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
。最后, 特定组的用户之间发送的所有消息都构成 discussion
或 topic
)。
这就是我想要做的(这很容易......不要想太多......它就像任何 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;