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

Форум MySQL

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

 

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

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

тема: Выбрать по 3 новости из каждой рубрики
 
 автор: mihdan   (21.06.2009 в 03:13)   письмо автору
 
 

Есть 2 таблицы

rubrics
id_rubric | name


news
id_news | id_rubric | name


Возможно ли с наименьшими затратами(одним запросом) вывести все это в виде

Рубрика 1
   Новость из рубрики 1
   Новость из рубрики 1 
   Новость из рубрики 1
             ,,,,,,,,,,,,,,,,,,,,,
Рубрика N
   Новость из рубрики N
   Новость из рубрики N
   Новость из рубрики N

  Ответить  
 
 автор: vadimka   (21.06.2009 в 12:36)   письмо автору
 
   для: mihdan   (21.06.2009 в 03:13)
 

Как запасной вариант с двумя запросами:)

$query ="SELECT * FROM rubrics group by id_rubric  " ;
$res = mysql_query($query);
   if(!mysql_query("$query")) exit("Ошибка ".mysql_error());
while($p = mysql_fetch_array($res) )
     {
$result = mysql_query("SELECT  * FROM  news  WHERE id_rubric='$p[id_rubric]' ORDER BY id_news  DESC LIMIT 3" );
while($s = mysql_fetch_array($result) )
     {
echo $s[name].$p[name]."<br>";
       }
    }

  Ответить  
 
 автор: mihdan   (22.06.2009 в 10:48)   письмо автору
 
   для: vadimka   (21.06.2009 в 12:36)
 

В данный момент оно так и работает. Хотелось бы узнать вариант с одним запросом

  Ответить  
 
 автор: mihdan   (22.06.2009 в 19:00)   письмо автору
 
   для: vadimka   (21.06.2009 в 12:36)
 

Зачем группировка? В первом запросе?

  Ответить  
 
 автор: 234234   (22.06.2009 в 23:01)
 
   для: mihdan   (22.06.2009 в 19:00)
 

Одним запросом, конечно, можно, но каждая строка результата будет вида (Рубрика N, Новость из рубрики N), т.е. повторение названия рубрики каждый раз.

  Ответить  
 
 автор: mihdan   (23.06.2009 в 11:21)   письмо автору
 
   для: 234234   (22.06.2009 в 23:01)
 

JOIN?

  Ответить  
 
 автор: Лена   (23.06.2009 в 14:10)   письмо автору
 
   для: mihdan   (21.06.2009 в 03:13)
 

JOIN
А нужный вам LIMIT уже сами поставьте

<?php
 $res 
mysql_query("SELECT r.id_rubric as rb, 
        r.name as rn,
        n.id_news as ni,
        n.name as nn
        FROM rubrics as r
        JOIN news as n ON r.id_rubric = n.id_rubric"
);
if(!
$res) exit("Error in $sql: "mysql_error());
for(
$i=0;$row mysql_fetch_assoc($res);){
    if(
$i != $row['rb']) {
    
$i $row['rb']; 
    print 
$row['rn'] . '<br>';
    }
    print 
$row['nn'] . '<br>';
}
?>

  Ответить  
 
 автор: Trianon   (23.06.2009 в 23:08)   письмо автору
 
   для: Лена   (23.06.2009 в 14:10)
 

что-то я не догоняю, как тут подставить нужный ( тот что в заголовке темы) LIMIT.

  Ответить  
 
 автор: Лена   (24.06.2009 в 00:20)   письмо автору
 
   для: Trianon   (23.06.2009 в 23:08)
 

Ошиблась. С LIMIT`ом здесь никак нельзя и без двух запросов, где во втором указать этот LIMIT, наверное, не обойтись.
И средствами РНР тоже никак не получится?

PS Вообще-то если вы не догоняете, значит 99% неправильно.

  Ответить  
 
 автор: Trianon   (24.06.2009 в 00:26)   письмо автору
 
   для: Лена   (24.06.2009 в 00:20)
 

>Ошиблась. С LIMIT`ом здесь никак нельзя и без двух запросов, где во втором указать этот LIMIT, наверное, не обойтись.
>И средствами РНР тоже никак не получится?

средствами php вполне. Только не двумя запросами, а n+1
Первый выберет n категорий, остальные - тройки строк.



PS. Не надо.

  Ответить  
 
 автор: mihdan   (24.06.2009 в 11:19)   письмо автору
 
   для: Trianon   (24.06.2009 в 00:26)
 

Видел нечто подобное одним запросом, но на другой СУБД, разве нереально такое в MySQL

  Ответить  
 
 автор: Eugene77   (01.07.2009 в 19:23)   письмо автору
 
   для: Trianon   (24.06.2009 в 00:26)
 

А как надо изменить структуру таблиц чтобы ради решения этой распространённой задачи не посылать сотни запросов?

  Ответить  
 
 автор: Trianon   (01.07.2009 в 19:37)   письмо автору
 
   для: Eugene77   (01.07.2009 в 19:23)
 

врядли выполнимо.

  Ответить  
 
 автор: Eugene77   (01.07.2009 в 20:27)   письмо автору
 
   для: Trianon   (01.07.2009 в 19:37)
 

Это наверно процедурами надо как-то решать?

  Ответить  
 
 автор: mihdan   (03.07.2009 в 11:09)   письмо автору
 
   для: Eugene77   (01.07.2009 в 20:27)
 

Да, но не советую, попробовал так сделать - результат разочаровал. Скорость выполнения оставляет желать лучшего. Проще сделать, как предложил Trianon

  Ответить  
 
 автор: kosta_in_net   (12.07.2009 в 12:58)   письмо автору
 
   для: mihdan   (03.07.2009 в 11:09)
 

вот варианнт из моего скрипта (вывод категорий с указанием количества постов по категории и отображением 10 последних постов):

$sql ='SELECT id,name,COALESCE(cnt, 0) AS cmtcnt ';
$sql.='FROM '.table_tip.' t ';
$sql.='LEFT JOIN (SELECT category,COUNT(*) AS cnt FROM '.table_doska.' d WHERE `hide` GROUP BY category) as d ';
$sql.='ON d.category = t.id ';
$sql.='ORDER BY `name`';

$preresult=mysql_query($sql) or die(mysql_error());
if($preresult && mysql_num_rows($preresult) != 0) {
while (@$presql_ar=mysql_fetch_assoc($preresult)) {
echo "<div class=block>";
echo "<p class=block-head><a href='?tip=".$presql_ar['id']."'>".$presql_ar['name']." (".$presql_ar['cmtcnt'].")</a></p>\r\n";

if($presql_ar['cmtcnt'] > 0){
$sql='SELECT id,name,created FROM '.table_doska.' WHERE `hide` AND category='.$presql_ar['id'].' ORDER BY `created` DESC LIMIT 0,10';// показывать все разрешенные
$result=mysql_query($sql) or die(mysql_error());
if($result && mysql_num_rows($result) != 0) {
echo "<table cellpadding=2 cellspacing=0 ><tr><th>Дата<th>Тема";
while (@$sql_ar=mysql_fetch_assoc($result)) {
echo "<tr><td>".$sql_ar['created']."<td><a href='?id=".$sql_ar['id']."'>".$sql_ar['name']."</a>\r\n";
}
echo "</table>";
}
}

echo "<P class=tar>Все объявления <a href='?tip=".$presql_ar['id']."'>".$presql_ar['name']." (".$presql_ar['cmtcnt'].")</a>";
echo "</div>";
}
}

  Ответить  
 
 автор: Eugene77   (13.07.2009 в 20:04)   письмо автору
 
   для: kosta_in_net   (12.07.2009 в 12:58)
 

А структуру табличек не могли бы приложить для ясности?

  Ответить  
Rambler's Top100
вверх

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