За последние 24 часа нас посетил 25401 программист и 1565 роботов. Сейчас ищут 1037 программистов ...

Сложная выборка

Тема в разделе "MySQL", создана пользователем dots_rei, 18 сен 2010.

  1. dots_rei

    dots_rei Активный пользователь

    С нами с:
    7 авг 2009
    Сообщения:
    193
    Симпатии:
    0
    Привет!
    Столкнулась с проблемой, не знаю, куда копать.
    Значит есть таблица пользователей и таблица групп. Один пользователь может принадлежать нескольким группам.
    Мне необходимо вывести определенное количество пользователей (для постраничного вывода).

    Структура таблицы пользователи:
    [sql]
    CREATE TABLE IF NOT EXISTS `users` (
    `id` int(11) NOT NULL AUTO_INCREMENT,
    `login` varchar(50) NOT NULL,
    `pass` varchar(50) NOT NULL,
    PRIMARY KEY (`id`)
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
    [/sql]

    Структура таблицы группы:
    [sql]
    CREATE TABLE IF NOT EXISTS `groups` (
    `id` int(11) NOT NULL AUTO_INCREMENT,
    `name` varchar(100) NOT NULL,
    `description` varchar(255) DEFAULT NULL,
    PRIMARY KEY (`id`)
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;[/sql]

    Структура таблицы, связывающей юзеров и группы:
    [sql]
    CREATE TABLE IF NOT EXISTS `groups_users` (
    `user_id` int(11) NOT NULL,
    `group_id` int(11) NOT NULL
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
    [/sql]

    В результате выполнения запроса
    [sql]
    SELECT `users`.*, `groups`.`name` AS `g_name`
    FROM `users`
    LEFT JOIN `groups_users` ON `users`.`id`=`groups_users`.`user_id`
    LEFT JOIN `groups` ON `groups_users`.`group_id`=`groups`.`id`
    LIMIT 0,5
    [/sql]
    получаю:
    [​IMG]

    Иными словами, 5 записей с учетом повторяющихся групп.
    Как перестроить запрос, чтоб получить количество записей для 5 пользователей, не зависимо от кого, в скольких группах они состоят (чтоб эти все группы были получены в запросе)?

    Надеюсь, понятно описала проблему :)
     
  2. Apple

    Apple Активный пользователь

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    Сломал моск.
     
  3. Volt(220)

    Volt(220) Активный пользователь

    С нами с:
    11 июн 2009
    Сообщения:
    1.640
    Симпатии:
    1
    [sql]select t.id, login, pass, name as g_name from
    groups LEFT JOIN `groups_users` ON `groups_users`.`group_id`=`groups`.`id`
    JOIN (select id, login, pass from users limit 0, 5) as t ON t.`id`=`groups_users`.`user_id`
    [/sql]
     
  4. dots_rei

    dots_rei Активный пользователь

    С нами с:
    7 авг 2009
    Сообщения:
    193
    Симпатии:
    0
    Volt(220), спасибо! :)