Database-Design

如何查詢文章的喜歡和使用者詳細資訊?

  • January 11, 2022

我對數據庫和 SQL 的世界很陌生。

我正在嘗試建立一個系統供使用者送出文章和喜歡文章。我一直在這個網站上查看一些類似的問題,閱讀有關第三範式等的資訊,我認為此時我有一個非常可靠的數據庫模式:

CREATE TABLE IF NOT EXISTS USERPROFILES (
 ID INT AUTO_INCREMENT PRIMARY KEY,
 USERNAME VARCHAR(64) NOT NULL,
 EMAIL_ADDRESS VARCHAR(255) NOT NULL,
 COUNTRY_CODE CHAR(2) NOT NULL,
 CREATED_DATE DATETIME(9) NOT NULL
)
ALTER TABLE USERPROFILES ADD CONSTRAINT USERPROFILES_USERNAME_UNIQUE UNIQUE (USERNAME)
ALTER TABLE USERPROFILES ADD CONSTRAINT USERPROFILES_EMAIL_ADDRESS_UNIQUE UNIQUE (EMAIL_ADDRESS)

CREATE TABLE IF NOT EXISTS USERPOSTS (
 ID INT AUTO_INCREMENT PRIMARY KEY,
 THREAD_ID INT NOT NULL,
 PARENT_POST_ID INT NULL,
 PROFILE_ID INT NOT NULL,
 WRITTEN_TEXT VARCHAR(500) NOT NULL,
 MEDIA_LOCATION VARCHAR(255) NULL,
 CREATED_DATE DATETIME(9) NOT NULL,
 CONSTRAINT FK_USERPOSTS_PROFILE_ID__ID FOREIGN KEY (PROFILE_ID) REFERENCES USERPROFILES(ID) ON DELETE RESTRICT ON UPDATE RESTRICT
)

CREATE TABLE IF NOT EXISTS USERVOTES (
 POST_ID INT,
 PROFILE_ID INT,
 CREATED_DATE DATETIME(9) NOT NULL,
 CONSTRAINT pk_UserVotes PRIMARY KEY (POST_ID, PROFILE_ID),
 CONSTRAINT FK_USERVOTES_POST_ID__ID FOREIGN KEY (POST_ID) REFERENCES USERPOSTS(ID) ON DELETE RESTRICT ON UPDATE RESTRICT,
 CONSTRAINT FK_USERVOTES_PROFILE_ID__ID FOREIGN KEY (PROFILE_ID) REFERENCES USERPROFILES(ID) ON DELETE RESTRICT ON UPDATE RESTRICT
)

現在我想做的是為我的應用程序執行一個查詢以獲取所有USERPOSTS給定的THREAD_ID(代表請求使用者),但也加入USERVOTESUSERPROFILES表,這樣我就可以獲得與以下數據相結合的文章列表

  • 文章的總點贊數
  • 請求使用者是否喜歡該文章
  • 文章送出者的使用者名(不僅僅是他們的使用者資料 ID)

有了這個,我可以在應用程序中呈現我需要的一切。

**鑑於我的表模式,任何人都可以幫助建構這樣的單個查詢嗎?**我假設我將需要至少兩個 INNER JOIN(一個在 USERVOTES 上,一個在 USERPROFILE 上)以及 USERVOTES 上的一個 COUNT(此外,我如何使用 WHERE 查詢 USERVOTES 以獲取特定的請求 USERID) ?

謝謝!

像這樣的東西應該​​可以解決問題(注意別名,並隨意將大小寫調整為您喜歡的格式):

SELECT 
   Posts.ID, 
   SUM(CASE WHEN Likes.ID IS NULL THEN 0 ELSE 1 END) AS TotalLikesCount,
   SubmitterProfiles.USERNAME,
   MAX(CASE WHEN Likes.PROFILE_ID = 98765 THEN 1 ELSE 0 END) AS DidRequestingUserLikeThisPost
FROM USERPOSTS AS Posts
INNER JOIN USERPROFILES AS SubmitterProfiles -- Inner Join should since a Post must be submitted by a User
   Posts.PROFILE_ID = SubmitterProfiles.ID
LEFT JOIN USERVOTES AS Likes -- Outer (Left) Join because not all Posts necessarily have Likes
   ON Posts.ID = Likes.POST_ID
LEFT JOIN USERPROFILES AS VoterProfiles -- Need to continue with an Outer (Left) Join here because we're pulling the profile of the User who liked the Post (if there is a like)
   ON Likes.PROFILE_ID = VoterProfiles.ID
WHERE Posts.THREAD_ID = 12345
GROUP BY Posts.ID, SubmitterProfiles.USERNAME

請閱讀評論以獲取更多資訊,但基本上這從您的USERPOSTS表格開始,內部連接您的USERPROFILES表格(應該始終具有多對一關係),然後外部連接其餘資訊(因為有些文章可能沒有喜歡)。

USERPOSTS由於和之間的關係USERVOTES是一對多的(當有贊時),結果集成為每個讚的一行,所以我們需要按ID文章的 進行分組,這樣我們就可以計算有多少贊(行)我正在使用SUM()帶有CASE語句的函式來處理NULL案例(當給定的文章沒有喜歡時)。

我們還必須按 分組USERPROFILES.USERNAME以便我們可以SELECT這樣做,這不會改變我們結果的基數,因為每個文章只能由單個使用者送出。

引用自:https://dba.stackexchange.com/questions/305857