|
|
|
| Есть 2 таблицы
rubrics
news
id_news | id_rubric | name
|
Возможно ли с наименьшими затратами(одним запросом) вывести все это в виде
Рубрика 1
Новость из рубрики 1
Новость из рубрики 1
Новость из рубрики 1
,,,,,,,,,,,,,,,,,,,,,
Рубрика N
Новость из рубрики N
Новость из рубрики N
Новость из рубрики N
|
| |
|
|
|
|
|
|
|
для: 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>";
}
}
|
| |
|
|
|
|
|
|
|
для: vadimka
(21.06.2009 в 12:36)
| | В данный момент оно так и работает. Хотелось бы узнать вариант с одним запросом | |
|
|
|
|
|
|
|
для: vadimka
(21.06.2009 в 12:36)
| | Зачем группировка? В первом запросе? | |
|
|
|
|
автор: 234234 (22.06.2009 в 23:01) |
|
|
для: mihdan
(22.06.2009 в 19:00)
| | Одним запросом, конечно, можно, но каждая строка результата будет вида (Рубрика N, Новость из рубрики N), т.е. повторение названия рубрики каждый раз. | |
|
|
|
|
|
|
|
для: 234234
(22.06.2009 в 23:01)
| | JOIN? | |
|
|
|
|
|
|
|
для: 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>';
}
?>
|
| |
|
|
|
|
|
|
|
для: Лена
(23.06.2009 в 14:10)
| | что-то я не догоняю, как тут подставить нужный ( тот что в заголовке темы) LIMIT. | |
|
|
|
|
|
|
|
для: Trianon
(23.06.2009 в 23:08)
| | Ошиблась. С LIMIT`ом здесь никак нельзя и без двух запросов, где во втором указать этот LIMIT, наверное, не обойтись.
И средствами РНР тоже никак не получится?
PS Вообще-то если вы не догоняете, значит 99% неправильно. | |
|
|
|
|
|
|
|
для: Лена
(24.06.2009 в 00:20)
| | >Ошиблась. С LIMIT`ом здесь никак нельзя и без двух запросов, где во втором указать этот LIMIT, наверное, не обойтись.
>И средствами РНР тоже никак не получится?
средствами php вполне. Только не двумя запросами, а n+1
Первый выберет n категорий, остальные - тройки строк.
PS. Не надо. | |
|
|
|
|
|
|
|
для: Trianon
(24.06.2009 в 00:26)
| | Видел нечто подобное одним запросом, но на другой СУБД, разве нереально такое в MySQL | |
|
|
|
|
|
|
|
для: Trianon
(24.06.2009 в 00:26)
| | А как надо изменить структуру таблиц чтобы ради решения этой распространённой задачи не посылать сотни запросов? | |
|
|
|
|
|
|
|
для: Eugene77
(01.07.2009 в 19:23)
| | врядли выполнимо. | |
|
|
|
|
|
|
|
для: Trianon
(01.07.2009 в 19:37)
| | Это наверно процедурами надо как-то решать? | |
|
|
|
|
|
|
|
для: Eugene77
(01.07.2009 в 20:27)
| | Да, но не советую, попробовал так сделать - результат разочаровал. Скорость выполнения оставляет желать лучшего. Проще сделать, как предложил Trianon | |
|
|
|
|
|
|
|
для: 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>";
}
} | |
|
|
|
|
|
|
|
для: kosta_in_net
(12.07.2009 в 12:58)
| | А структуру табличек не могли бы приложить для ясности? | |
|
|
|