2013-03-02 88 views
1

概述: 我想获得配置文件和他们喜欢的电影列表。所有输出将显示在一个页面上。我在本地主机上运行时使用mySQL和PHP。理想情况下,我希望这是在一个查询,速度。在MySQL的mySQL列表配置文件和电影使用一个查询,但三个表中的复杂连接

数据库表概述如下:

profile_tbl: 
> id 
> username 
> about me 
> gender 
> hobbies 
> profile_pic 
> last_login 


movies_tbl: 
> id 
> movie_name 
> genre 
> length 
> rating 
> description 


profile_movies_rel_tbl 
> id 
> movie_id 
> profile_id 

输出:

我想告诉10个个人资料和所有他们喜欢的电影名单。我想下面的查询:

SELECT profile_tbl.*, movies_tbl.* FROM profile_tbl 
LEFT JOIN profile_movies_rel_tbl 
ON profile_movies_rel_tbl.movie_id = movies_tbl.id 
LEFT JOIN profile_tbl 
ON profile_tbl.id= profile_movies_rel_tbl.profile_id LIMIT 10 

我也有一个第二个问题,在这里我要列出所有已选定电影有喜欢的,再在页面中应列出的配置文件和电影一起轮廓。 在这种情况下,我想用上面的查询,添加以下内容:

WHERE profile_movies_rel_tbl.movie_id = 4 

任何一个需要更多的信息,请留下评论。

感谢

回答

1

我想你想使用限制子查询返回10个不同的配置文件:

SELECT profile_tbl.*, movies_tbl.* 
FROM (
    SELECT DISTINCT Id FROM profile_tbl LIMIT 10 
    ) LimitTable 
    INNER JOIN profile_tbl ON profile_tbl.Id=LimitTable.Id 
    LEFT JOIN profile_movies_rel_tbl 
     ON profile_movies_rel_tbl.profile_id = profile_tbl.id 
    LEFT JOIN movies_tbl 
     ON profile_movies_rel_tbl.movie_id = movies_tbl.id 

这可能会返回超过10行,但它应该只包含10个配置文件。

如果您想要返回10行,请查看使用GROUP_CONCAT将您的电影组合成单个列。

0

你可以简单地使用这个连接。使用GROUP_CONCAT将 给你一个所有电影的列表,但逗号分隔。你可以使用php爆炸函数 来爆炸,它会给你一个数组的结果。 比你可以使用循环该数组显示电影名称

SELECT 
    pt.*, 
    GROUP_CONCAT(movie_name) AS `Movies` 
FROM profile_tbl AS pt 
INNER JOIN profile_movies_rel_tbl AS pmrt ON pmrt.profile_id = pt.id 
INNER JOIN movies_tbl AS mt ON mt.id = pmrt.movie_id 
GROUP BY pt.id 
    LIMIT 10 
    ORDER BY pt.id DESC