如何使用重复数据创建SQL分页困难联接查询?

时间:2018-11-24 12:38:25

标签: sql postgresql

我在数据库中有几个表。 用户,个人资料和用户角色。 配置文件和用户之间的一对一关系。 角色和用户之间的关系是多对多的。

Scheme

要选择所有用户,我发送以下请求:

SELECT A.role_id, A.role_name, A.user_id,B.user_username, B.user_password, B.profile_color_text, B.profile_color_menu, B.profile_color_bg FROM
  (SELECT Roles.role_id, Roles.role_name, UserRoles.user_id 
      FROM Roles INNER JOIN UserRoles ON Roles.role_id = UserRoles.role_id) AS A 
LEFT JOIN 
  (SELECT Users.user_username, Users.user_password, Profiles.profile_color_text, Profiles.profile_color_menu, Profiles.profile_color_bg, Profiles.profile_id 
      FROM Users INNER JOIN Profiles ON Users.user_id = Profiles.profile_id) AS B
ON A.user_id = B.profile_id;

问题是如何选择分页?

1 个答案:

答案 0 :(得分:0)

我将首先获得10个用户,然后执行联接。这样做的两个原因:

  1. 由于您不希望只显示10个结果,而只想要10个用户的结果(可以包含任意数量的行),因此您无法获取所有数据然后对其进行限制,否则,您可能会获得10个包含以下内容的数据行5个用户;
  2. 即使点1无关紧要,因为总是存在1-1的关系,尤其是如果结果数很小(如10),则先获得这些结果然后再加入较小的“表”上会更快,而不是对所有数据进行所有联接,然后对其进行限制。

SELECT
    u.user_id,
    u.user_username,
    u.user_password,
    r.role_id,
    r.role_name,
    p.profile_id,
    p.profile_color_text, 
    p.profile_color_menu, 
    p.profile_color_bg
FROM (
    SELECT user_id, user_username, user_password
    FROM users
    ORDER BY ???
    OFFSET 10
    LIMIT 10
) AS u
LEFT JOIN profiles AS p
    ON u.user_id = p.profile_id
LEFT JOIN userroles AS ur
    ON u.user_id = ur.user_id
LEFT JOIN roles AS r
    ON ur.role_id = r.role_id

我假设您需要一些订单,所以我在其中输入了ORDER BY-完成。

添加偏移以获得第二页结果;第一页不需要它,也可以是OFFSET 0。然后使用LIMIT当然可以限制页面大小。

我还以对我来说更有意义的方式重组了联接。