【问题标题】:To get output of movie with its genre获取电影类型的输出
【发布时间】:2019-08-17 04:39:16
【问题描述】:

我正在编写一个程序来输出具有该类型的电影。

sample database

Movie        movie_id , title (1, snitch)
genre        genre_id , genre (1, Action)(2, Animation)(3, Drama)(4, Crime )
movie_genre  movie_id, genre_id (1,1)(1,3)(1,4)

这是我的代码

  <?php 
  $stmt = $pdo->query("
  SELECT * 
   FROM movie, genre, movie_genre WHERE movie.movie_id = 
   movie_genre.movie_id AND genre.genre_id = movie_genre.genre_id And 
   movie.name='snitch'
  ");
   while ($row = $stmt->fetch()){

   $title= $row['title'];
   $genre= $row['genre'];
   ?>
        <h1> <?php echo $title ; ?> </h1>
            <h1> <?php echo $genre ; ?> </h1>

    <?php } ?>

我得到的输出是“ 告密者 行动 告密者 戏剧 告密者 犯罪”

但我想要“ 告密者 行动 戏剧 犯罪”

【问题讨论】:

    标签: php mysql sql pdo


    【解决方案1】:

    每个 $row 都包含标题(“告密者”)和一种类型。你遍历这个,所以它与每一行的标题相呼应。试试这个替换:

       $oldtitle = $title = '';
       while ($row = $stmt->fetch()){
    
       $title= $row['title'];
       if ( $oldtitle == $title ) $title = '';
       else  $oldtitle = $title;
    
       $genre= $row['genre'];
       ?>
            <h1> <?php echo $title ; ?> </h1>
                <h1> <?php echo $genre ; ?> </h1>
    
       <?php } ?>
    

    【讨论】:

      【解决方案2】:

      在选择部分您没有提及任何字段。您可以通过 2 种方式正确。

      SELECT movie.movie_id , movie.title , genre.genre
      FROM movie, genre, movie_genre WHERE movie.movie_id = 
      movie_genre.movie_id AND genre.genre_id = movie_genre.genre_id And 
      movie.name='snitch'
      

      SELECT movie.movie_id , movie.title , genre.genre
      FROM movie 
      INNER JOIN movie_genre ON movie.movie_id = movie_genre.movie_id
      INNER JOIN genre ON genre.genre_id = movie_genre.genre_id 
      WHERE movie.name='snitch'
      

      【讨论】:

      • 不,我也不喜欢。我只是使用他的代码并修复选项一中的选择部分
      【解决方案3】:

      您在循环的每次迭代中都在呼应标题类型。由于您对某个标题特别感兴趣,因此一种可能的解决方案是从结果中提取类型:

      $title = 'snitch';
      $stmt = $pdo->prepare("SELECT * FROM movie, genre, movie_genre 
          WHERE movie.movie_id = movie_genre.movie_id 
          AND genre.genre_id = movie_genre.genre_id AND movie.title = :title");
      
      $stmt->execute([':title' => $title]);
      $genre = [];
      while ($row = $stmt->fetch()){
          $genre[] = $row['genre'];
      }
      
      echo $title . ': ' . implode(', ', $genre);
      

      对于多个标题,您可以遵循类似的策略:

      $movie_genres = [];
      while ($row = $stmt->fetch()) {
        // If this movie isn't in the result yet...
        if (!isset($movie_genres[$row['title']])) {
            $movie_genres[$row['title']] = [];
        }
        // Add the genre
        $movie_genres[$row['title']][] = $row['genre'];
      }
      

      Demo

      【讨论】:

        【解决方案4】:

        您可以使用PDO's constants 和方法fetchAll()。试试PDO::FETCH_GROUP。它将按第一列对查询中的所有结果进行分组。在这种情况下,我只获取 2 列 titlegenre。结果是:

        Array ( 
            [snitch] => Array ( 
                [0] => Action 
                [1] => Drama 
                [2] => Crime 
            ) 
        )
        

        我将它与PDO::FETCH_COLUMN 混合以在我的子数组中仅获取一列,但您无需这样做,您可以获取整个数组。

        $stmt = $pdo->query("SELECT title, genre
            FROM movie, genre, movie_genre 
            WHERE movie.movie_id = movie_genre.movie_id 
                AND genre.genre_id = movie_genre.genre_id 
                And movie.title='snitch'
        ");
        $data = $stmt->fetchAll(\PDO::FETCH_GROUP|\PDO::FETCH_COLUMN);
        foreach($data as $title => $genres){
            echo '<h1>'.$title.'</h1>';
            foreach($genres as $genre){
                echo '<h2>'.$genre.'</h2>';
            }
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2023-03-07
          • 2013-12-26
          • 2021-11-19
          • 2012-12-24
          • 2017-02-27
          • 1970-01-01
          • 2023-03-10
          • 2015-07-06
          相关资源
          最近更新 更多