[英]PHP mySQL retrieve unique correct data from multiple tables
所以我正在制作這個網頁(為了練習網絡開發的樂趣),用戶可以在其中對電影進行評分或評論。 我擁有的一頁是您單擊電影以獲取完整詳細信息的地方,它列出了所有評分和評論(如果用戶通過評論進行評論並通過名為“reviewMovie”的頁面進行評分......評級是強制性的,否則他們可以在此頁面上評論“listMovieReviews”)。
我在查詢時遇到的問題是詳細信息不正確
討論表存儲:討論 ID(主鍵)、評論的時間戳、評論、發表評論的用戶以及他們評論的電影。
討論表存儲:討論 ID(主鍵)、評論的時間戳、評論、發表評論的用戶以及他們評論的電影。
評分表存儲:評分 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 但仍然無濟於事
我哪里錯了??
也是第一次發帖很抱歉如果我不太清楚,格式錯誤,或者沒有顯示足夠的工作,但我真的被卡住了
我假設:
您的查詢很好,也許您的問題出在您的 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.