mySQL在一个查询中列出了使用复杂联接的概要文件和影片,但有三个表


mySQL list profiles and movies using complex joins in one query but three tables

概述:我想得到一份个人资料和他们喜欢的电影的列表。所有输出都显示在一页上。我使用的是mySQL和PHP,目前运行在localhost上。理想情况下,为了速度,我希望这是在一个查询中。

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

任何人需要更多信息,请留言评论。

感谢

我认为您想在子查询中使用LIMIT来返回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_CONCT将您的电影组合成一列。

您可以简单地使用联接。使用GROUP_CONCT将给你一份所有电影的列表,但以逗号分隔。你可以爆炸使用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