Как создать SQL-пагинацию сложного запроса соединения с дублирующимися данными? - PullRequest
0 голосов
/ 24 ноября 2018

У меня есть несколько таблиц в базе данных.Пользователи, профили и роли пользователей.Отношения профилей и пользователей один в один.Соотношение ролей и пользователей много ко многим.

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 голосов
/ 24 ноября 2018

Сначала я получу 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 добавлено для получения второй страницы результатов;первая страница не требует этого или будет OFFSET 0.Затем, конечно, LIMIT, чтобы ограничить размер страницы.

Я также реструктурировал объединения таким образом, чтобы это имело больше смысла для меня.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...