Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Помогите составить mysql запрос на выборку 5 элементов у которых в другой таблице наибольшее число повторений

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Описание: Помогите составить mysql запрос на выборку 5 элементов у которых в другой таблице наибольшее число повторений
oleg000_som
Отправлено: 21 Июня, 2011 - 23:09:41
Post Id


Новичок


Покинул форум
Сообщений всего: 5
Дата рег-ции: Июнь 2011  


Помог: 0 раз(а)




Существуют 2 таблицы: comments и groups
comments - таблица с комментариями к описанию группы
groups - таблица с информацией о группах
comments содержит поля: id, post, author, text_com и т. д.
groups содержит : id, img_src, title и т. д.

При добавлении комментария в поле post таблицы comments заносится идентификатор группы из groups.

Теперь мне нужно сделать следующее: выбрать поля id, img_src, title из таблицы groups тех пяти групп, у которых наибольшее количество комментариев в comments. Короче говоря, выбрать 5 наиболее популярных в обсуждении групп.
 
 Top
Давит
Отправлено: 21 Июня, 2011 - 23:39:45
Post Id



Частый гость


Покинул форум
Сообщений всего: 147
Дата рег-ции: Май 2011  


Помог: 2 раз(а)




Попробую так
PHP:
скопировать код в буфер обмена
  1. mysql_query("SELECT id, COUNT(id) FROM comments GROUP BY id LIMIT '5'");
  2.                                  
  3.   while($row = mysql_fetch_array) {
  4.  
  5.       mysql_query("SELECT id, img_src, title FROM groups WHERE id='".$row["id"]."'");
  6.  
  7.            $rows = mysql_fetch_array;
  8.  
  9.            $group[] = array($rows["id"],$rows["img_src"],$rows["title"]);
  10.   }

(Отредактировано автором: 22 Июня, 2011 - 00:36:59)

 
 Top
OrmaJever
Отправлено: 22 Июня, 2011 - 01:27:37
Post Id



Активный участник


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


Помог: 299 раз(а)




CODE (SQL):
скопировать код в буфер обмена
  1. SELECT c.id AS c_id, g.id AS g_id,  g.img_src, g.title FROM comments AS c, groups AS g WHERE g.id=c.id GROUP BY id LIMIT 5

можно 2 запроса обьеденить в один


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
oleg000_som
Отправлено: 22 Июня, 2011 - 05:57:54
Post Id


Новичок


Покинул форум
Сообщений всего: 5
Дата рег-ции: Июнь 2011  


Помог: 0 раз(а)




я тут решил сесть и добить этот вопрос...
расписал все по полочкам... получилось много лишнего кода, но ... в общем сами смотрите:
CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. $qq1 = mysql_query("SELECT post FROM comments WHERE `v_a`='1'"); /*Выбираем все комментарии для музыки (`v_a`='1') */
  3.         $aa1 = mysql_fetch_array($qq1);
  4.         do {
  5.            $ar[] = $aa1['post'];/*помещаем все результаты в массив*/       
  6.         }
  7.         while ($aa1 = mysql_fetch_array($qq1));
  8.         print "<br>";
  9.         $ar = array_unique($ar);/*очищаем от повторяющихся результатов*/
  10.        
  11.         for ($i=0;$i<count($ar);$i++){
  12.            $qq2 = sprintf('SELECT count(post) FROM comments WHERE `post`="%s" AND `v_a`=1',$ar[$i]);/*считаем кол-во записей по каждому посту*/
  13.            $rr2 = mysql_query($qq2);
  14.            $aa2 = mysql_fetch_array($rr2);
  15.            $ar2[] = $aa2['0'];/*помещаем все результаты в массив*/
  16.            print_r ($aa2['0']." ");
  17.         }
  18.         print "<br>";
  19.         $arr = array_combine($ar,$ar2);
  20.         print_r($arr);echo"<br>";
  21.         /*помещаем 2 полученных массива в 1. ключи которого будут номерами постов, а значения - кол-вом комментариев*/
  22.         natsort($arr); /*сортируем по возрастанию*/print_r($arr);echo"<br>";
  23.         arsort($arr); /*и в обратном порядке*/print_r($arr);echo"<br>";
  24.    
  25.         /*получаем пятерку победителей по количеству комментариев*/
  26.         $list[] = key($arr);
  27.         next($arr);
  28.         $list[] = key($arr);
  29.         next($arr);
  30.         $list[] = key($arr);
  31.         next($arr);
  32.         $list[] = key($arr);
  33.         next($arr);
  34.         $list[] = key($arr);
  35.        
  36.         print_r($list);echo"<br>";
  37.         /*выбираем и печатаем в цыкле нужные элементы*/
  38.         print "<p>";
  39.         for ($k=0; $k<count($list); $k++){
  40.            $qq3 = sprintf('SELECT `id`,`group`,`img_src` FROM music WHERE `id`="%s"' ,$list[$k]);
  41.            $rr3 = mysql_query($qq3);
  42.            $aa3 = mysql_fetch_array($rr3);
  43.            printf ("<a href='view_music.php?music_id=%s'><img src='%s' alt='%s' width='110'/></a> ",$aa3['id'],$aa3['img_src'],$aa3['group']);
  44.         }
  45.         print "</p>";
  46.  


Вот только count в mysql запросе ведет себя странно:одни нормально считает, а другие не правильно... на посте номер 8 вместо положенных 4х считает, что их 2... а на втором, что их 4 когда их 1 (учитывая поля, где v_a='1')...
Прикреплено изображение (Нажмите для увеличения)
1.JPG

(Отредактировано автором: 22 Июня, 2011 - 06:08:18)

 
 Top
Slavenin
Отправлено: 22 Июня, 2011 - 06:50:28
Post Id



Посетитель


Покинул форум
Сообщений всего: 285
Дата рег-ции: Май 2010  
Откуда: Тверь


Помог: 4 раз(а)




все можно сделать одним запросом, и не плодить сущности сверх необходимого Подмигивание если вдруг не будет работать, то эт по причине нехватки данных о таблицах

CODE (SQL):
скопировать код в буфер обмена
  1. SELECT count (a.id ) AS countP, b.id, b.img_src, b.title FROM comments AS a
  2. INNER JOIN groups AS b
  3. ON a.идентификатор группы в таблице = b.id
  4. GROUP BY a.идентификатор группы в таблице
  5. ORDER BY countP
  6. LIMIT 5
  7. DESC

(Отредактировано автором: 22 Июня, 2011 - 06:51:46)

 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« SQL и Архитектура БД »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB