Database-Design
如何查詢文章的喜歡和使用者詳細資訊?
我對數據庫和 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
(代表請求使用者),但也加入USERVOTES
和USERPROFILES
表,這樣我就可以獲得與以下數據相結合的文章列表:
- 文章的總點贊數
- 請求使用者是否喜歡該文章
- 文章送出者的使用者名(不僅僅是他們的使用者資料 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
這樣做,這不會改變我們結果的基數,因為每個文章只能由單個使用者送出。