簡體   English   中英

帶有多個表和外鍵的MySQL查詢

[英]Mysql query with multiple tables and foreign keys

考慮以下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)

附言:我自己沒有建立這個表結構,但這似乎是邏輯。 唯一的問題是上述問題。

@伊戈爾·卡馬尼亞(Igor Carmagna):

我已經回答了您的問題,並據此認為您需要列出最終用戶留下的最重要的5條消息,對嗎? 因此,請按照以下給出的步驟操作。

1)首先,對於大多數事情,您需要做的就是加入。 2)在此步驟中,您需要使用max()函數,該函數將根據收到的消息為您提供用戶列表。 現在,根據您的問題,您只需要擁有前5條記錄,因此您必須使用(max-5)函數,才能獲得前5條記錄

希望這會讓你開心! 干杯:):P

這是我的建議。 使用DISTINCT可以獲取不同的記錄,而使用LIMIT只能獲取五個記錄。 您可以將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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM