我正在编写一个程序,以获取具有该类型的电影的输出。
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 } ?>
我得到的输出是“ 告密者 行动 告密者 戏剧 告密者 犯罪“
但是我想要“ 告密者 行动 戏剧 犯罪“
答案 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'];
}
答案 3 :(得分:0)
您可以使用PDO's constants和方法fetchAll()
。尝试PDO::FETCH_GROUP
。它将按第一列将查询中的所有结果分组。在这种情况下,我仅提取2列title
和genre
。结果是:
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>';
}
}