Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Сложный запрос, связывание двух таблиц. ПОМОГИТЕ
 
 автор: cernos   (10.02.2008 в 00:13)   письмо автору
 
 

Есть таблица с новостями на сайте и Есть таблица с комментариями на сайте.

[b]Таблица с новостями:
id  - ID новости
autor - Автор Новости, тип ВАРЧАР
date - Дата публикации, формат 2008-01-08 23:47:45
short_story  -  краткая новость
full_story  - полная новость


Таблица с комментариями:
id - ID комментария
post_id - ID новости в которой размещен комментарий
user_id - ID пользователя
date  - Дата публикации, формат 2008-01-08 23:47:45
autor - Автор комментария, тип ВАРЧАР 
text - Текст комментария



Новость          Комментарий
id              =      post_id
author     =       author


Задача:
Необходимо вывести 5 пользователей, которые опубликовали самое большее кол-во новостей и комментариев за сутки (приоритетом является кол-во новостей), в таком виде:

author | News | Coms
cernos     10          5
Vasya        5           3
Petya         3           10
Masha       3           9
Leonid       1           0



БУДУ ОЧЕНЬ БЛАГОДАРЕН ЗА РЕШЕНИЕ ДАННОЙ ЗАДАЧИ

   
 
 автор: Trianon   (10.02.2008 в 01:36)   письмо автору
 
   для: cernos   (10.02.2008 в 00:13)
 

Нужна таблица с авторами.
То есть в принципе, конечно, не нужна.
Но для ненормализованной базы решать задачку лениво. :)

   
 
 автор: Trianon   (10.02.2008 в 01:59)   письмо автору
 
   для: cernos   (10.02.2008 в 00:13)
 

Если вдруг нормализуете.
SELECT A.name, news_count, coms_count 
  FROM users_table AS A 
  LEFT JOIN (SELECT N.author AS news_user_id, count(N.id) AS news_count
              FROM news_table
              WHERE `date` > NOW() - INTERVAL 1 DAY
              GROUP BY news_user_id 
              HAVING news_count > 0
            ) AS NC ON A.id = NC.news_user_id
  LEFT JOIN (SELECT C.author AS coms_user_id, count(C.id) AS coms_count
              FROM coms_table
              WHERE `date` > NOW() - INTERVAL 1 DAY
              GROUP BY coms_user_id 
              HAVING coms_count > 0
            ) AS CC ON A.id = CC.coms_user_id
ORDER BY news_count DESC, coms_count DESC
LIMIT 5;


PS. Между тем, поскольку полного внешнего соединения в MySQL нет, решать задачу для ненормализованной базы (т.е. без отдельной таблицы авторов) будет запарно.

   
 
 автор: cernos   (10.02.2008 в 20:16)   письмо автору
 
   для: Trianon   (10.02.2008 в 01:59)
 

Таблица пользователей:
email 
password 
name 
user_id  
user_group 
lastdate 
reg_date 
banned


Таблица с пользователями называется: gal_user
Таблица с комментариями называется: gal_comments
Таблица с новостями называется: gal_news

Просьба сделать все для этих таблиц, т.к. не понимаю в запросе которые вы првиели, с какой таблицы и откуда берется. Спасибо заранее. Оч благодарен за помощь!

   
 
 автор: Trianon   (10.02.2008 в 20:18)   письмо автору
 
   для: cernos   (10.02.2008 в 20:16)
 

авторы в таблицах новостей и коментариев должны быть INT и равны id'ам в таблице пользователей.

   
 
 автор: cernos   (10.02.2008 в 20:34)   письмо автору
 
   для: Trianon   (10.02.2008 в 20:18)
 

Приравнивываю данные в таблицах

NEWS --- ---COMMENT --- --- AUTHOR
author = author = name

Хранятся в ВАРЧАР

Нет возможности выборки делать по идам, т.к. в таблице новостей нет такого поля, как ид. пользователя.

   
 
 автор: cernos   (10.02.2008 в 21:47)   письмо автору
 
   для: cernos   (10.02.2008 в 20:34)
 

UP

   
 
 автор: Shiva   (10.02.2008 в 16:02)   письмо автору
 
   для: cernos   (10.02.2008 в 00:13)
 

Вот это сработает для текущей структуры базы, но об обптимальности здесь речь уже не идет.

select r.autor, r.news_count, count(c.id) as coms_count 
from (
    select a.autor, count(n.id) as news_count
    from (
            select distinct autor from news
            union
            select distinct autor from comments 
            where autor not in (
                                   select distinct autor from news
                               )
         ) as a
    left join news as n
        on a.autor = n.autor
        and n.`date` > (now() - interval 1 day)
    group by a.autor
    ) as r
left join comments as c
    on r.autor = c.autor
    and c.`date` > (now() - interval 1 day)
group by r.autor
order by news_count desc, coms_count desc
limit 5

   
 
 автор: cernos   (10.02.2008 в 22:11)   письмо автору
 
   для: Shiva   (10.02.2008 в 16:02)
 

Спасибо Всем, я все сделал конечно же не без вашей помощи.

Я разорался в этих лефт джоин, благодаря Вам и мануалу :) и сам написал запрос:

select tu.name, news, coms from users as tu
LEFT JOIN (
           SELECT tn.autor, count(tn.id) as news
           FROM news as tn
           where  `date` > NOW() - INTERVAL 1 DAY
           GROUP BY autor
           ) as tn ON tu.name=tn.autor
LEFT JOIN (
           SELECT tc.autor, count(tc.id) as coms
           FROM comments as tc
           where  `date` > NOW() - INTERVAL 1 DAY
           GROUP BY autor
           ) as tc ON tu.name=tc.autor;


Насчет лимитов и ордер бай я эт я допишу :)

   
 
 автор: Shiva   (11.02.2008 в 00:11)   письмо автору
 
   для: cernos   (10.02.2008 в 22:11)
 

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

   
 
 автор: cernos   (11.02.2008 в 14:11)   письмо автору
 
   для: Shiva   (11.02.2008 в 00:11)
 

Я понял, твой запрос рабочий, спасибо и за него. Теперь буду знать как это все длается. :)
Без Вас я бы не решил данную задачу :)

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования