Объединение 2ух таблиц и группировка одним запросом

Тема в разделе "Базы данных", создана пользователем lolshik, 4 мар 2010.

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

    lolshik

    Регистр.:
    21 фев 2008
    Сообщения:
    316
    Симпатии:
    127
    Доброе время суток, коллеги.
    Подскажите пожалуйста возможно ли решить мою задачу одним запросом к базе mysql?
    Имеем две таблицы. Одна с новостями, другая с комментариями к новостям.

    Комментарии
    [​IMG]
    Новости
    [​IMG]
    Можно ли одним запросом получить ТОП 5 самых комментируемых новостей. Вида: id новости, название новости, кол-во комментариев?
     
  2. stasdre

    stasdre Постоялец

    Регистр.:
    15 янв 2010
    Сообщения:
    125
    Симпатии:
    18
    Используй конструкцию LEFT JOIN ON для объединения двух таблиц
     
  3. ercalote

    ercalote Постоялец

    Регистр.:
    27 мар 2008
    Сообщения:
    86
    Симпатии:
    21
    Попробуйте как-нибудь так:

    select Новости.*, count(Комментарии.id_comment) as c from Новости left join комментарии on новости.id_news = комментарии.id_news group by Новости.id_news order by c limit 5

    или

    select top 5 news.id_news from Новости news
    inner join Комментарии comm on comm.id_news = news.id_news
    where count(comm.id_comment)>0
    group by news.id_news
    order by count(comm.id_comment) desc

    или

    select news.id_news from Новости news
    inner join (
    select top 5 id_news, count(id_comment) comm_count from Комментарии
    where count(id_comment)>0
    group by id_news) comm on comm.id_news = news.id_news
    order by comm.comm_count desc
     
  4. lolshik

    lolshik

    Регистр.:
    21 фев 2008
    Сообщения:
    316
    Симпатии:
    127
    Не смог разобраться с этой конструкцией. Решил так

    PHP:
    SELECT COUNT( * ) AS count_numcn.name_news
    FROM coment_news n
    news cn
    WHERE n
    .id_news cn.id_news
    GROUP BY n
    .id_news
    ORDER BY 
    `count_numASC
    LIMIT 0 
    30
    Единственное, что не понятно. Почему если сделать стоблец COUNT (*) после cn.name_news т.е. (SELECT cn.name_news, COUNT( * ) AS count_num FROM ....) перестаёт работать сортировка по стобцу count_num.

    С чем это связано?
     
  5. LLIbIcpEP

    LLIbIcpEP Создатель

    Регистр.:
    7 май 2008
    Сообщения:
    19
    Симпатии:
    2
    Код:
    SELECT COUNT(*) AS count_num, news.name_news
    FROM coment_news
    LEFT JOIN news
    ON news.id_news = coment_news.id_news
    GROUP BY coment_news.id_news
    ORDER BY count_num ASC
    LIMIT 0 , 30
    Как-то так, если переписать ваш запрос. Лефт джоины быстрее работают. Ну подставлять необходимые поля в SELECT. Кстати COUNT(*) тут не сработает, надо указать с какой таблицы его делать.
     
  6. lolshik

    lolshik

    Регистр.:
    21 фев 2008
    Сообщения:
    316
    Симпатии:
    127
    Ваш вариант проверил. Не удалось понять на сколько он быстр. У меня запросы выполняются в интервале от 0.0097 сек. до
    0.05 сек. Хаотично и не поддаются анализу.
     
Статус темы:
Закрыта.