如何在多对多关系中只重复一次行
how to repeat rows only once in many to many relationship
我正在 php 上处理多对多关系
我有 3 tables ,电影 table 其中包含电影名称和电影 ID
流派 table 包含流派和流派 ID
和 movie_genre table 具有电影 ID 和流派 ID
流派 table 具有这些值
(1 ,'action'),
(2 ,'comedy'),
(3 ,'drama'),
(4 ,'mystery');
我使用下面的代码来获取数据
$query = " SELECT movie_name,movie_id,genre FROM movies
JOIN movie_genre ON movies.movie_id = movie_genre.movie_id
JOIN genre ON movie_genre.genre_id = genre.genre_id
WHERE movie.movie_id = ?";
$stmt = mysqli_prepare($conn, $query);
$stmt->bind_param('i', $id);
$stmt->execute();
$result = $stmt->get_result();
if(mysqli_num_rows($result) > 0 ){
while ($row = mysqli_fetch_assoc($result)) {
echo ' movie_id: '.$row["movie_id"].' movie name:'.$row["movie_name"].'
Genres:' .$row["genre"]
}}
但结果会像
movie_id movie_name 流派[1]
movie_id movie_name 流派[2]
movie_id movie_name 流派[3]
一个例子
movie_id:55 movie name: titanic genre : action
movie_id:55 movie name: titanic genre : drama
movie_id:55 movie name: titanic genre : romance
我想要的结果是
movie_id:55 movie name: titanic genre : action drama romance
我确实尝试使用限制 1,但结果只显示第一种类型
您可以使用 GROUP_CONCAT
和 GROUP BY
:
SELECT movie_name,movie_id, GROUP_CONCAT(genre SEPARATOR ' ') AS genre
FROM movies
JOIN movie_genre ON movies.movie_id = movie_genre.movie_id
JOIN genre ON movie_genre.genre_id = genre.genre_id
WHERE movie.movie_id = ?
GROUP BY movie_name,movie_id
只需要为流派做一个循环我无法测试这个,所以这只是把我想象的会起作用的东西放在一起,但它会一直存在这些行,这里可能有语法错误
$query = " SELECT movie_name,movie_id,genre FROM movies
JOIN movie_genre ON movies.movie_id = movie_genre.movie_id
JOIN genre ON movie_genre.genre_id = genre.genre_id
WHERE movie.movie_id = ?";
$stmt = mysqli_prepare($conn, $query);
$stmt->bind_param('i', $id);
$stmt->execute();
$result = $stmt->get_result();
if(mysqli_num_rows($result) > 0 ){
// if it's greater than zero, great, we have at least 1 movie.
// but if it's greater than 1, then we know we have more than 1 genre
while ($row = mysqli_fetch_assoc($result)) {
echo 'movie_id:'.$row["movie_id"].'movie name:'.$row["movie_name"];
break; // so it only runs through this loop once, instead of using limit
}//end while
if(mysqli_num_rows($result) > 1 ){
// more than 1 genre so loop and print out just genres
while ($row = mysqli_fetch_assoc($result)) {
echo $row["genre"];
}//end while
}//end if more than 1 genre
}//end if
我正在 php 上处理多对多关系
我有 3 tables ,电影 table 其中包含电影名称和电影 ID
流派 table 包含流派和流派 ID
和 movie_genre table 具有电影 ID 和流派 ID
流派 table 具有这些值
(1 ,'action'),
(2 ,'comedy'),
(3 ,'drama'),
(4 ,'mystery');
我使用下面的代码来获取数据
$query = " SELECT movie_name,movie_id,genre FROM movies
JOIN movie_genre ON movies.movie_id = movie_genre.movie_id
JOIN genre ON movie_genre.genre_id = genre.genre_id
WHERE movie.movie_id = ?";
$stmt = mysqli_prepare($conn, $query);
$stmt->bind_param('i', $id);
$stmt->execute();
$result = $stmt->get_result();
if(mysqli_num_rows($result) > 0 ){
while ($row = mysqli_fetch_assoc($result)) {
echo ' movie_id: '.$row["movie_id"].' movie name:'.$row["movie_name"].'
Genres:' .$row["genre"]
}}
但结果会像
movie_id movie_name 流派[1]
movie_id movie_name 流派[2]
movie_id movie_name 流派[3]
一个例子
movie_id:55 movie name: titanic genre : action
movie_id:55 movie name: titanic genre : drama
movie_id:55 movie name: titanic genre : romance
我想要的结果是
movie_id:55 movie name: titanic genre : action drama romance
我确实尝试使用限制 1,但结果只显示第一种类型
您可以使用 GROUP_CONCAT
和 GROUP BY
:
SELECT movie_name,movie_id, GROUP_CONCAT(genre SEPARATOR ' ') AS genre
FROM movies
JOIN movie_genre ON movies.movie_id = movie_genre.movie_id
JOIN genre ON movie_genre.genre_id = genre.genre_id
WHERE movie.movie_id = ?
GROUP BY movie_name,movie_id
只需要为流派做一个循环我无法测试这个,所以这只是把我想象的会起作用的东西放在一起,但它会一直存在这些行,这里可能有语法错误
$query = " SELECT movie_name,movie_id,genre FROM movies
JOIN movie_genre ON movies.movie_id = movie_genre.movie_id
JOIN genre ON movie_genre.genre_id = genre.genre_id
WHERE movie.movie_id = ?";
$stmt = mysqli_prepare($conn, $query);
$stmt->bind_param('i', $id);
$stmt->execute();
$result = $stmt->get_result();
if(mysqli_num_rows($result) > 0 ){
// if it's greater than zero, great, we have at least 1 movie.
// but if it's greater than 1, then we know we have more than 1 genre
while ($row = mysqli_fetch_assoc($result)) {
echo 'movie_id:'.$row["movie_id"].'movie name:'.$row["movie_name"];
break; // so it only runs through this loop once, instead of using limit
}//end while
if(mysqli_num_rows($result) > 1 ){
// more than 1 genre so loop and print out just genres
while ($row = mysqli_fetch_assoc($result)) {
echo $row["genre"];
}//end while
}//end if more than 1 genre
}//end if