[英]How should be my mysql table structure?
這就是我要的:
用戶將在我的網站中發送一個或兩個值,然后將它們存儲在兩個變量$genres1
和$genres2
。
像:如果用戶發送動作,那么我的代碼將顯示所有具有動作類型的電影。 如果用戶發送了Action + Crime,則我的表格將使用Action + Crime提取所有電影。
得到它了?
我當前的表結構是一對多關系,像這樣
tmdb_id movie_title
-----------------------------
1 Iron man
2 Logan
3 Batman
4 The hangover
tmdb_id genres
-----------------------------
1 Action
1 Crime
2 Drama
2 Action
3 Crime
3 Action
4 Comedy
4 Drama
但是這里的問題是,我無法實現上面我解釋的內容。
第二個選擇:我制作一張這樣的桌子:
movie_tile genres1 genres2 genres3 genres4
----------------------------------------------------
Logan Action Crime Drama Null
Iron man Action Crime Null Null
我可以用下面這行代碼做些什么:
SELECT * FROM movies WHERE (genres1='$genres1' or genres2='$genres1' orgenres1='$genres3' or genres3='$genres1')
還有其他選擇嗎?
使用表格寬度類型,並使用其他表格將影片連接到任何類型
-----
movieid title
-----
1 Logan
2 Smurf
-----
-----
genreid genre
-----
1 animated
2 blue people
-----
-----
movieid genreid
-----
1 1
2 1
2 2
-----
這樣一來,您就不會被限制為每部電影4種類型
現在,我更好地閱讀了您的問題。 這就是您要做的,但是您省略了流派表。
第二個選項不好,因為您只能將自己限制在4個類別中
這連接到PHP嗎? 我認為最簡單的方法是通過聯接查詢(按影片和PHP中的循環排序)進一步解決此問題
您是否希望所有電影(根據用戶要求)的流派既是犯罪又是動作?
SELECT mg.movieid, count(1), m.title
FROM movies_genres mg
JOIN movies m ON m.movieid mg.movieid
WHERE mg.genreid = 1 OR mg.genreid =3
group by mg.movieid, m.title
HAVING COUNT(1) = 2
編輯:以及其他類型
SELECT movies.movieid,movies.title, genres.genre
FROM movies
JOIN movie_genre mg ON mg.movieid = movies.movieid
JOIN genres on genres.genreid = mg.genreid
WHERE movie.movieid IN (
SELECT mg.movieid
FROM movies_genres mg
WHERE mg.genreid = 1 OR mg.genreid =3
GROUP BY mg.movieid
HAVING COUNT(1) = 2
)
忘了提:count = 2,表示您給了2個流派的流派。 也可以是1、3或25
select distinct a.tmdb_id, a.movie_tittle
from movie_tittle a inner join genre_tittle b
on a.tmdb_id = b.tmdb_id
where b.genres in ('Action', 'Crime')
根據您的評論,嘗試以下操作:
SELECT
a.tmdb_id, a.movie_tittle
FROM
movie_tittle a inner join genre_tittle b
ON
a.tmdb_id = b.tmdb_id
WHERE
b.genres in ('Action', 'Crime')
GROUP BY
a.tmdb_id, a.movie_tittle
HAVING
count(a.tmdb_id) = 2
表genre_tittle中的tmdb_id和流派不應重復。 將其作為主鍵。
但是這里的問題是,我無法用[前兩個表]實現上面解釋的內容
是的你可以。 假設兩個表被稱為movies
和movie_genres
,您可以選擇使用有兩個標簽中的電影:
SELECT movie_title FROM movies
JOIN movie_genres genre1 USING (tmdb_id)
JOIN movie_genres genre2 USING (tmdb_id)
WHERE genre1.genres = 'Action'
AND genre2.genres = 'Crime'
嘗試這樣的事情:
tableA
Movie_ID Movie_title
1 Iron man
2 Logan
3 Batman
4 The hangover
tableB
Genre_ID Genre_title
1 Action
2 Crime
3 Drama
4 Comedy
tableC
ID Movie_ID Genre_ID
1 1 1
2 1 2
3 2 2
4 2 3
查詢:
Select A.Movie_title,B.Genre_title
from tableC C
inner join tableA A on A.Movie_ID = C.Movie_ID
inner join tableB B on B.Genre_ID = C.Genre_ID
where
C.Genre_ID in (IFNULL(val1,0),IFNULL(val2,0))
您應該制作一個關系表來解決您這樣的問題
電影桌
movie_id movie_name genre_id
1 alien 2
2 logan 1
3 ps i love you 4
4 click 3
那么您將需要一個體裁表
體裁表
genre_id genre_type
1 action
2 sci fi
3 comedy
4 romance
那么您的選擇將鏈接到表格
function get_movies_by_genre($genre_id) {
global $MySQLiConnect;
$query = '
SELECT *
FROM movies m
INNER JOIN genre g ON (g.genre_id = m.genre_id)
WHERE g.genre_id = ?
';
$stmt = $DBConnect->stmt_init();
if ($stmt->prepare($query)) {
$stmt->bind_param("i", $genre_id);
$stmt->execute();
$result = $stmt->get_result();
$rows = $result->fetch_all(MYSQLI_ASSOC);
$stmt->close();
}
return $rows;
}
要么
function get_movies_by_genre($genre_id) {
global $MySQLiConnect;
$query = '
SELECT *
FROM movies m
INNER JOIN genre g ON (g.genre_id = m.genre_id)
WHERE g.genre_name = ?
';
$stmt = $DBConnect->stmt_init();
if ($stmt->prepare($query)) {
$stmt->bind_param("i", $genre_id);
$stmt->execute();
$result = $stmt->get_result();
$rows = $result->fetch_all(MYSQLI_ASSOC);
$stmt->close();
}
return $rows;
}
這是從電影表中獲取所有信息的基本功能,具體取決於您向其發送的流派ID。
至於多個ID,則可以通過foreach循環針對所需的genre_ids運行該函數,然后根據需要顯示它們。
我希望這有幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.