mysql - 如何停止某些记录在SQL查询中显示多次

这里是Complete SQL Fiddle
如您所见,recommendations表中的记录显示了多次。但是如果我删除这一行,它们就不会显示多次。所以这条线是主要的问题。
为了简单起见,我没有在SQL查询中使用cast表。但我需要它。
是的,我需要LEFT JOIN cast ON cast.cast_tmdb_id=tmdb_movies.tmdb_id 在我的group_concat中一起显示记录
我想这就是所需要的全部信息。如果你需要更多的信息或者想让我再解释一遍,请告诉我。
编辑:亲爱的@Shadow,他将此建议标记为重复。如果使用PHP code则不会显示所有记录。因为有可能两部电影的平均收视率DISTINCT

最佳答案

你的问题不太清楚。那是因为你没有表现出想要的结果。
在查询中,您将选择一列推荐的电影标题和另一列有投票权的电影标题。但是,这些都不相关,因为您没有指定订单。例如,第一部推荐的电影可能会有第五张选票。即使投票是按电影排序的,那还是很难理解。
所以从理想的结果开始。然后才编写查询。
例子:
预期结果:

movie_title       | roles                          | recommendations
------------------+--------------------------------+------------------------
The Dark Knight   | Christian Bale (Bruce Wayne /  | The Dark Knight Rises (7.5),
                  | Batman), Michael Caine (Alfred | Batman Begins (7.5), Iron 
                  | Pennyworth), ...               | Man (7.3), ...

So we need an aggreation from the cast table (all roles per movie) and one from the recommendation table (all recommendations per movie). Do the aggregations first and then join the results:

SELECT 
  m.movie_title,
  c.roles,
  r.movies as recommendations
FROM tmdb_movies m
LEFT JOIN
(
  SELECT 
    cast_tmdb_id as movie_id,
    GROUP_CONCAT(CONCAT(cast_name, ' (', cast_character, ')') SEPARATOR ', ') as roles
  FROM cast
  GROUP BY cast_tmdb_id
) c ON c.movie_id = m.tmdb_id
LEFT JOIN
(
  SELECT 
    recommendations_tmdb_id as movie_id,
    GROUP_CONCAT(CONCAT(recommendations_title, ' (', recommendations_vote_average, ')')
                 SEPARATOR ', ') as movies
  FROM recommendations
  GROUP BY recommendations_tmdb_id
) r ON r.movie_id = m.tmdb_id
WHERE m.tmdb_id = 1;

这是rextester链接: http://rextester.com/FHA48503