簡體   English   中英

PHP mySQL 從多個表中檢索唯一正確的數據

[英]PHP mySQL retrieve unique correct data from multiple tables

所以我正在制作這個網頁(為了練習網絡開發的樂趣),用戶可以在其中對電影進行評分或評論。 我擁有的一頁是您單擊電影以獲取完整詳細信息的地方,它列出了所有評分和評論(如果用戶通過評論進行評論並通過名為“reviewMovie”的頁面進行評分......評級是強制性的,否則他們可以在此頁面上評論“listMovieReviews”)。

我在查詢時遇到的問題是詳細信息不正確

  1. 討論表存儲:討論 ID(主鍵)、評論的時間戳、評論、發表評論的用戶以及他們評論的電影。

  2. 討論表存儲:討論 ID(主鍵)、評論的時間戳、評論、發表評論的用戶以及他們評論的電影。

  3. 評分表存儲:評分 ID(主鍵)、被評分的電影、評分的用戶和評分(滿分 10)

因此,組合數據的一些示例是:

  • 用戶 1(用戶 1)已將“美國精神病”評為 4/10 並對其發表評論“評論 1”

  • User2(管理員..出於測試目的)已將“American Psycho”評為 8/10 並對其發表評論“comment2”

因此,在列出“美國精神病人”的詳細信息和評級/評論的頁面上,我應該有以下評級和評論列表:

<TIMESTAMP FOR COMMENT1> User1 Rating 4/10 "comment1"
<TIMESTAMP FOR COMMENT2> admin Rating 8/10 "comment2"

使用以下查詢:

SELECT * 
FROM discussion 
INNER JOIN users ON discussion.userID = users.userID                                                 
WHERE discussion.movieID = <American Psycho's Movie ID>;

SELECT * 
FROM ratings 
INNER JOIN movies ON ratings.movieID = movies.movieID 
WHERE ratings.movieID = <American Psycho's Movie ID>;  

我明白了:

<TIMESTAMP FOR COMMENT2> admin Rating 4/10 "comment2"
<TIMESTAMP FOR COMMENT2> admin Rating 8/10 "comment2"

我已經嘗試了其他幾個 INNER JOINS 連接存儲用戶信息的表和存儲電影信息的表,但我不斷收到混合數據

也嘗試了 DISTINCT 和 UNION 但仍然無濟於事

我哪里錯了??

也是第一次發帖很抱歉如果我不太清楚,格式錯誤,或者沒有顯示足夠的工作,但我真的被卡住了

我假設:

  • 一部電影可以有 0 到 n 條評論。
  • 一部電影可以有 0 到 n 個評分。
  • 用戶只能對電影評分一次或不評分。
  • 用戶可以評論一部電影 0 到 n 次。

您的查詢很好,也許您的問題出在您的 php 代碼中。

您必須考慮到用戶可能多次評論一部電影但從未對其進行評分。

在第二個查詢中,您應該使用用戶(而不是電影,因為您沒有獲得電影信息)來獲得用戶名。

也許您應該在兩張表中顯示信息:一張用於評分,另一張用於評論。

(必須用電影ID替換引號)

SELECT u.userName, r.score
FROM ratings AS r
INNER JOIN users AS u ON r.userID = u.userID 
WHERE r.movieID = ?; 
SELECT u.userName, d.commentTime, d.comment
FROM discussion AS d
INNER JOIN users AS u ON d.userID = u.userID                                                 
WHERE d.movieID = ?;

您可以通過這種方式將每個用戶的所有評論分組為一行(但我認為這不是您要查找的內容):

SELECT u.userName, GROUP_CONCAT(CONCAT(d.commentTime, ': ', d.comment) SEPARATOR '; ') AS comments
FROM discussion AS d
INNER JOIN users AS u ON d.userID = u.userID                                                 
WHERE d.movieID = ?
GROUP BY u.userName 

我認為在這種情況下進行一個查詢沒有意義,但是如果您想在一個查詢中獲取所有數據,您可以嘗試這樣的事情:

每行都會有一個評論,例如,如果一個用戶發表了兩條評論,那么對於同一用戶,您將有兩行評分相同。

首先,我讓所有對所選電影進行評論或評級的用戶,並在電影和這些用戶之間進行 CROSS JOIN。 然后我用關於電影 ID 和用戶 ID 的討論進行 LEFT JOIN 和另一個對電影 ID 和用戶 ID 進行評級的 LEFT JOIN。

您需要使用 LEFT JOIN 而不是 INNER JOIN,因為如果電影沒有評分或評論,您的結果將為空。

在 SELECT 子句中,您應該只列出您需要的列。

SELECT *
FROM movies m

CROSS JOIN (SELECT d.userID
            FROM discussion d
            WHERE d.movieID = ?
            
            UNION 
            
            SELECT r.userID
            FROM ratings r
            WHERE r.movieID = ?) AS u

LEFT JOIN discussion AS d ON m.movieID = d.movieID AND u.userID = d.userID

LEFT JOIN ratings AS r ON  m.movieID = r.movieID AND u.userID = r.userID

LEFT JOIN users ON u.userID = users.userID

WHERE m.movieID = ?;

您需要加入所有三個表。

SELECT *
FROM movies AS m
JOIN ratings AS r ON r.movieID = m.movieID
JOIN discussion AS d ON d.userID = r.userID AND d.movieID = m.movieID
WHERE m.movieID = <American Psycho's Movie ID>
ORDER BY r.userID, d.timestamp

這將重復每個評論的電影和評級信息。 您可以在顯示結果的應用程序代碼中刪除這些重復項。 請參閱如何在 PHP 中列出與 while 循環相同的 id 數據? 有關如何執行此操作的示例。

SELECT * FROM movies AS MOVIE
JOIN ratings AS RATING ON `RATING.movieID` = `MOVIE.movieID`
JOIN discussion AS DISCUS ON `DISCUS.userID` = `RATING.userID`
WHERE `MOVIE.movieID` = <SOME Movie ID> 
ORDER BY `RATING.userID`, `DISCUS.timestamp`

暫無
暫無

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

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