获得电影的流派

时间:2019-08-17 04:39:16

标签: php mysql sql pdo

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

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 } ?>

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

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

4 个答案:

答案 0 :(得分:1)

每个$ row包含标题(“ Snitch”)和一个流派。您可以循环浏览此内容,因此它在每一行中都呼应了标题。尝试以下替代方法:

   $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 } ?>

答案 1 :(得分:0)

在选择部分中,您未提及任何字段。您可以采用两种方式。

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'

OR

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'

答案 2 :(得分:0)

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

$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

答案 3 :(得分:0)

您可以使用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>';
    }
}