簡體   English   中英

我的mysql表結構應該如何?

[英]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和流派不應重復。 將其作為主鍵。

但是這里的問題是,我無法用[前兩個表]實現上面解釋的內容

是的你可以。 假設兩個表被稱為moviesmovie_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.

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