如何使用PHP选择和回显MySQL数据(一对多)

时间:2017-06-27 02:50:33

标签: php mysql

这是我目前的代码,它可以解决一个问题。

$stmt = $conn->prepare("SELECT * FROM tmdb_movies JOIN genres ON genres.genres_tmdb_id=tmdb_movies.tmdb_id 
  ");
     // Then fire it up
     $stmt->execute();
     // Pick up the result as an array
     $result = $stmt->fetchAll();

    // Now you run through this array in many ways, for example
     foreach ($result as $row) {
    print "".$row["movie_title"]." ".$row["genres_name"] ."   ".$row["cast_name"] ."<br/>";
}

问题是,我试图回应电影名称和它的类型。

我想回应:

  

黑暗骑士 - 行动,犯罪,戏剧

代码回应:

  

黑暗骑士 - 行动

     

黑暗骑士 - 犯罪

     

黑暗骑士 - 戏剧

主要电影表http://prntscr.com/fokwip

的屏幕截图

和类型电影表http://prntscr.com/fokwoy

的屏幕截图

2 个答案:

答案 0 :(得分:1)

要回显您想要的内容,您可以更改您的SQL查询:

$stmt = $conn->prepare("SELECT *, GROUP_CONCAT(genres.genres_name SEPARATOR ', ') AS genre_concat FROM tmdb_movies JOIN genres ON genres.genres_tmdb_id=tmdb_movies.tmdb_id GROUP BY tmdb_movies.movie_title");

//  sql strict group by

$stmt = $conn->prepare("SELECT tmdb_movies.movie_title, tmdb_movies.cast_name, GROUP_CONCAT(DISTINCT genres.genres_name SEPARATOR ', ') AS genre_concat FROM tmdb_movies JOIN genres ON genres.genres_tmdb_id=tmdb_movies.tmdb_id GROUP BY tmdb_movies.movie_title, tmdb_movies.cast_name ORDER BY tmdb_movies.movie_title");

$stmt->execute();

$result = $stmt->fetchAll();

foreach ($result as $row) {
        print "".$row["movie_title"]." ".$row["genre_concat"] ."   ".$row["cast_name"] ."<br/>";}

GROUP_CONCAT允许连接每个独特电影片名的所有不同类型。

更多文档:

GROUP BY:https://www.w3schools.com/sql/sql_groupby.asp

GROUP_CONCAT:https://dev.mysql.com/doc/refman/5.7/en/group-by-functions.html#function_group-concat

答案 1 :(得分:1)

您可以使用group bygroup_cancat

SELECT
    tmdb_movies.*, group_concat(genres.genres_name) as genres_names
FROM
    tmdb_movies 
JOIN 
    genres 
ON 
    genres.genres_tmdb_id=tmdb_movies.tmdb_id
GROUP BY 
    tmdb_movies.movie_id

然后打印出来:

foreach ($result as $row) {
    echo "{$row['movie_title']} - {$row['genres_names']}<br/>";
}

替代SQL(似乎比上面的sql好):

SELECT
    tmdb_movies.*, temp.genres_names
FROM
    tmdb_movies 
JOIN 
    (
        SELECT 
            genres_tmdb_id, group_concat(genres_name) as genres_names 
        FROM 
            genres
        GROUP BY 
            genres_tmdb_id
    ) temp 
    ON 
       temp.genres_tmdb_id = tmdb_movies.tmdb_id

希望这有帮助。