получить данные из 3 таблиц

Тема в разделе "Базы данных", создана пользователем xorbit, 17 июн 2008.

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

    xorbit Постоялец

    Регистр.:
    13 июн 2007
    Сообщения:
    105
    Симпатии:
    90
    такая задача возникла нужно получить список с такими данными

    ид пользователя, имя пользователя, кол.-во входящих сообщений, кол.-во исходящих сообщений

    из таблиц:

    users_group
    id_group, id_user

    users
    id, name

    messages
    id, id_sender, id_recipient



    SELECT u.id, u.name, COUNT(ms.sender) AS send, COUNT(mr.recipient) AS rec

    FROM user AS u
    LEFT JOIN messages AS ms ON (u.id = ms.sender)
    LEFT JOIN messages AS mr ON (u.id = mr.recipient)
    WHERE
    u.id IN (SELECT id_user
    FROM users_group
    WHERE id_group=5 ORDER BY id_user)

    LIMIT 0,100
     
    TrueBit нравится это.
  2. Rid

    Rid Создатель

    Регистр.:
    10 авг 2007
    Сообщения:
    14
    Симпатии:
    4
    Не пойдет ли так:

    select u.id, min(u.name) as name, count(ms.sender) as send, count(mr.recipient) as rec
    from users u
    left join messages ms on ms.id_sender=u.id
    left join messages mr on mr.id_recipient=u.id
    left join users_group gr on gr.id_user=u.id
    where gr.id_group=5
    group by u.id

    поскольку count агрегатная функция, то нужно добавлять группировку
     
    xorbit нравится это.
  3. xorbit

    xorbit Постоялец

    Регистр.:
    13 июн 2007
    Сообщения:
    105
    Симпатии:
    90
    спасибо помогло, подскажи плиз что почитать что б больше не задавать дурацких вопросов )

    протестировал запросы с join и подзапрос, без под запроса значительное ускорение...
     
    TrueBit нравится это.
  4. StealthForce

    StealthForce Создатель

    Регистр.:
    3 дек 2007
    Сообщения:
    39
    Симпатии:
    3
  5. xorbit

    xorbit Постоялец

    Регистр.:
    13 июн 2007
    Сообщения:
    105
    Симпатии:
    90
    не совсем все гладко почемуто если при написанных 3 и полученных 2 выводит что отправил и получил по 6 ...
     
    TrueBit нравится это.
  6. xorbit

    xorbit Постоялец

    Регистр.:
    13 июн 2007
    Сообщения:
    105
    Симпатии:
    90
    все тему можно закрыть!
    задача была решена с при помощи подзапросов

    SELECT u.ID, u.NickName,
    (SELECT count(*) FROM messages ms WHERE u.ID = ms.Sender) AS Sender,
    (SELECT count(*) FROM messages mr WHERE u.ID = mr.Recipient) AS Recipient
    FROM users u
    LEFT JOIN user_group ug ON (ug.idProfile = u.ID)
    WHERE ug.idAff=5
    GROUP BY u.ID, u.NickName
     
    TrueBit нравится это.
Статус темы:
Закрыта.