Mysql pапрос на выборку из 2х разных таблиц

Тема в разделе "Базы данных", создана пользователем terkin, 20 апр 2008.

Статус темы:
Закрыта.
Модераторы: latteo
  1. terkin

    terkin

    Регистр.:
    9 дек 2006
    Сообщения:
    513
    Симпатии:
    162
    есть 2 таблицы - в одной записаны пользователи, в другой группы пользователей, нужно сделать выборку которая посчитает сколько пользователей состоит в каждой из груп

    Запрос
    PHP:
    SELECT user_group.id,user_group.name,count(users.idFROM `user_group`, `usersWHERE user_group.id=users.status GROUP BY user_group.id
    возвращает только группу в которой есть пользователи, а как сделать что бы вернул и группы в которых ещё нет пользователей
     
  2. elcaste

    elcaste

    Регистр.:
    30 ноя 2007
    Сообщения:
    322
    Симпатии:
    175
    Попробуй SELECT ALL.
     
  3. terkin

    terkin

    Регистр.:
    9 дек 2006
    Сообщения:
    513
    Симпатии:
    162
    Такой интсрукции и нету даже :) зачем фигню писать :-]
     
  4. elcaste

    elcaste

    Регистр.:
    30 ноя 2007
    Сообщения:
    322
    Симпатии:
    175
    Может у нас разный mysql?
    Ты бы глянул хоть :)

    SELECT [STRAIGHT_JOIN]
    [SQL_SMALL_RESULT] [SQL_BIG_RESULT] [SQL_BUFFER_RESULT]
    [SQL_CACHE | SQL_NO_CACHE] [SQL_CALC_FOUND_ROWS] [HIGH_PRIORITY]
    [DISTINCT | DISTINCTROW | ALL]
    select_expression,...
    [INTO {OUTFILE | DUMPFILE} 'file_name' export_options]
    [FROM table_references
    [WHERE where_definition]
    [GROUP BY {unsigned_integer | col_name | formula} [ASC | DESC], ...]
    [HAVING where_definition]
    [ORDER BY {unsigned_integer | col_name | formula} [ASC | DESC], ...]
    [LIMIT [offset,] rows | rows OFFSET offset]
    [PROCEDURE procedure_name(argument_list)]
    [FOR UPDATE | LOCK IN SHARE MODE]]

    Хотя в этом случае она похоже не поможет.

    Добавлено через 8 минут
    Это конечно немного извращение но работает.

    PHP:
    SELECT user_group.iduser_group.name,count(users.status
    FROM user_groupusers 
    WHERE user_group
    .id=users.status 
    GROUP BY user_group
    .id 
    UNION
    SELECT user_group
    .iduser_group.name
    FROM user_group
    users 
    WHERE user_group
    .id NOT IN (SELECT users.status FROM users)
    GROUP BY user_group.id
     
    terkin нравится это.
  5. terkin

    terkin

    Регистр.:
    9 дек 2006
    Сообщения:
    513
    Симпатии:
    162
    А за это вот спасибо, пока так пусть побудет, запрос впринципе не критический, а вот про SELECT ALL погорячился, понял теперь что ты имел ввиду, но как его в данном случае употребить не пойму
     
  6. elcaste

    elcaste

    Регистр.:
    30 ноя 2007
    Сообщения:
    322
    Симпатии:
    175
    Только учти, что NOT IN работает очень медленно. На таблицах с несколькими десятками тысяч записей вывода можно и не дождаться :)

    Тут его ни как не употребишь, он просто явно объявляет включение в вывод дубликатов и пустых строк. Как то он меня выручил, но сейчас того скрипта у меня нет :(

    ЗЫ: Спасибо тут говорят кнопкой ;)
     
  7. terkin

    terkin

    Регистр.:
    9 дек 2006
    Сообщения:
    513
    Симпатии:
    162
    Тут часть кода как раз где записей будет не много так что такое решение подойдет.


    Кнопку ткнул ещё до того как в посте благодарить :)
     
  8. fpinger

    fpinger

    Регистр.:
    11 май 2007
    Сообщения:
    254
    Симпатии:
    58
    PHP:
    SELECT `user_group`.id AS group_id
    `
    user_group`.name AS group_name
    count(`users`.id) AS users_count 
    FROM 
    `user_group
    LEFT JOIN `usersON `user_group`.id=`users`.status
    GROUP BY 
    `user_group`.id  
     
Статус темы:
Закрыта.