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

Форум MySQL

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

 

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

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

тема: Можно ли из 3 запросов к базе сделать 2
 
 автор: kis-kis   (10.05.2007 в 17:23)   письмо автору
 
 

Данный код выводит 4 новости каждой категории, 3 - просто ссылками (первый запрос), а 1 - ссылка и изображение (2 запрос). Можно ли сделать такой же вывод, но одним запросом к базе, а не двумя.
Спасибо.

Код:


<?php
$query_cat 
"SELECT * FROM cat_news";
$result_cat=mysql_query($query_cat) or die("<B>Error ".mysql_errno()." :</B> ".mysql_error()."");
if (
mysql_num_rows($result_cat)!=0)
{
while(
$news_cat mysql_fetch_array($result_cat)) 
{
?>
        <table width="100%" border="0" cellspacing="0" cellpadding="0" align="center">
          <td height=1 bgcolor="#2164a3"> </td>
                  </table>
        <table width="100%" border="0" cellspacing="0" cellpadding="0">
          <tr> 
            <td> 
              <H2><a href="<?php echo $news_cat["en_name"];?>"><?php echo $news_cat["name"];?></a></H2>
            </td>
            <td><a href="<?php echo $news_cat["en_name"];?>">
              <li>все новости раздела</li>
              </a></td>
          </tr>
          <tr> 
            <td width="50%" valign="top"> 
<?php
$query_news 
"SELECT * FROM news WHERE category = '$news_cat[id]' order by data DESC limit 1,3";
$result_news=mysql_query($query_news) or die("<B>Error ".mysql_errno()." :</B> ".mysql_error()."");
if (
mysql_num_rows($result_news)!=0)
{
?>
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<?php
while($news mysql_fetch_array($result_news)) 
{
?>
                <tr> 
<td class="block">
<?php
echo "<span class=data>"."$ndata"." · ".$news["author"]."</span><br>";
?>
<a href="<?php echo $news["id"]; ?>"><?php echo $news["title"]; ?></a></td>
</tr>
<?php
}
?>
              </table>
              <?php
}
?>
            </td>
<?php
$query_inews 
"SELECT * FROM news WHERE category = '$news_cat[id]' order by data DESC limit 1";
$result_inews=mysql_query($query_inews) or die("<B>Error ".mysql_errno()." :</B> ".mysql_error()."");
if (
mysql_num_rows($result_inews)!=0)
{
while(
$inews mysql_fetch_array($result_inews)) 
{
?>
            <td width="50%" valign="top" bgcolor="#E2EBF5"> 
              <table width="100%" border="0" cellspacing="0" cellpadding="0" align="center">
        <td height=1 bgcolor="#2164a3"> </td>
      </table>
              <table width="100%" border="0" cellspacing="10" cellpadding="0">
                <tr> 
                  <td valign="top" rowspan="2"> 
                    <div style="width:110px;height:105px; background-image:url(/img/in_shad.gif); background-position:bottom; background-repeat:no-repeat;"><img src="/news/img/01000000.jpg" width="100" height="90" class="w5i" alt="<?php echo htmlspecialchars($inews["title"]);?>" title="<?php echo htmlspecialchars($inews["title"]);?>"></div>
                  </td>
                  <td width="100%" valign="top"><a href="<?php echo $inews["id"]; ?>"><?php echo $inews["title"]; ?></a></td>
                </tr>
                <tr> 
                  <td width="100%" valign="top"> 
                    <?php echo $inews["subtitle"]; ?>
                  </td>
                </tr>
              </table>
            </td>
            <?php
}
}
?>
          </tr>
          <tr> 
            <td colspan="2" height="12">&nbsp;</td>
          </tr>
        </table>
        <?php
}
}
?>

   
 
 автор: Unkind   (10.05.2007 в 17:39)   письмо автору
 
   для: kis-kis   (10.05.2007 в 17:23)
 

Крайне не удобно читать такой код. Очень много мусора. Не делаете отступы и зачем-то скопировали и HTML-код.

   
 
 автор: kis-kis   (10.05.2007 в 17:42)   письмо автору
 
   для: Unkind   (10.05.2007 в 17:39)
 

Иначе, будет, как мне кажется, не понятна суть данного вывода...)

   
 
 автор: Unkind   (10.05.2007 в 17:56)   письмо автору
 
   для: kis-kis   (10.05.2007 в 17:42)
 

Ммм. Например, bgcolor="#E2EBF5" поможет нам разобраться в Вашем коде? А чем отступы помешают? :)

Сравните:


<?php
if(condition)
{
while(
condition)
{
if(
condition)
{
//Code
}
}
}
?>


и


<?php
if(condition)
{
    while(
condition)
    {
        if(
condition)
        {
        
//Code
        
}
    }
}
?>


Что приятнее и удобнее читать?

   
 
 автор: Trianon   (10.05.2007 в 19:11)   письмо автору
 
   для: kis-kis   (10.05.2007 в 17:23)
 

Вас не затруднит прикрепить фрагмент дампа со структурой и куском данных таблиц?

P.S. Касательно стиля Unkind прав. Вы подчеркиваете стилем оформление (дизайнерскую часть разработки), в то время как вопросы то у Вас по алгоритму. А алгоритм как раз и остается за кадром.
Но это хотя и тяжело, но терпимо, если есть возможность поглядеть скрипт в действии.
А без исходных табличных данных даже поглядеть толком не получается.

   
 
 автор: kis-kis   (10.05.2007 в 19:53)   письмо автору
 
   для: Trianon   (10.05.2007 в 19:11)
 

Спасибо за понимание...


CREATE TABLE `cat_news` (
  `id` int(11) NOT NULL default '0',
  `name` varchar(255) NOT NULL default '',
  `en_name` varchar(255) NOT NULL default '',
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251;
-- 
-- Дамп данных таблицы `cat_news`
-- 
INSERT INTO `cat_news` (`id`, `name`, 
`en_name`) VALUES (1, 'Политика', 
'politics');
INSERT INTO `cat_news` (`id`, `name`, 
`en_name`) VALUES (2, 'Общество', 
'society');
INSERT INTO `cat_news` (`id`, `name`, 
`en_name`) VALUES (3, 'Экономика', 
'economy');
INSERT INTO `cat_news` (`id`, `name`, 
`en_name`) VALUES (4, 'Спорт', 'sport');
INSERT INTO `cat_news` (`id`, `name`, 
`en_name`) VALUES (5, 'Происшествия', 
'incident');
INSERT INTO `cat_news` (`id`, `name`, 
`en_name`) VALUES (6, 'Культура', 
'culture');
INSERT INTO `cat_news` (`id`, `name`, 
`en_name`) VALUES (7, 'Авто', 'avto');



CREATE TABLE `news` (
  `id` int(11) NOT NULL auto_increment,
  `title` varchar(255) NOT NULL default '',
  `subtitle` varchar(255) NOT NULL default '',
  `icon` varchar(50) NOT NULL default '',
  `short_mess` text NOT NULL,
  `full_mess` text NOT NULL,
  `author` text NOT NULL,
  `url_author` text NOT NULL,
  `category` int(1) default '0',
  `data` datetime NOT NULL default '0000-00-00 00:00:00',
  `status` int(1) default '0',
  `comments` int(1) default '0',
  `news_read` smallint(6) NOT NULL default '0',
  PRIMARY KEY  (`id`),
  KEY `category` (`category`),
  KEY `comments` (`comments`),
  KEY `news_read` (`news_read`),
  KEY `data` (`data`),
  KEY `status` (`status`),
  FULLTEXT KEY `full_mess` (`full_mess`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 PACK_KEYS=0 AUTO_INCREMENT=4 ;
-- 
-- Дамп данных таблицы `news`
-- 
INSERT INTO `news` (`id`, `title`, 
`subtitle`, `icon`, `short_mess`, 
`full_mess`, `author`, `url_author`, 
`category`, `data`, `status`, `comments`, 
`news_read`) VALUES (1, 'Самые дорогие 
рестораны мира', '', '', 'Деловой журнал 
Forbes составил список самых дорогих 
ресторанов в мире.', 'Деловой журнал Forbes 
составил где не представлена служба Zagat 
Survey, в частности в Москве, были приняты 
во внимание рекомендации, которые дают 
своим гостям местные пятизвездочные отели.
\r\nУказанные суммы в долларах являются 
ценой обеда на одного человека, включая 
один безалкогольный напиток и чаевые, или 
же фиксированную цену на обед.', '', '', 2, 
'2007-05-10 19:51:57', 0, 0, 1);
INSERT INTO `news` (`id`, `title`, 
`subtitle`, `icon`, `short_mess`, 
`full_mess`, `author`, `url_author`, 
`category`, `data`, `status`, `comments`, 
`news_read`) VALUES (2, 'Харуки Мураками 
наградили премией Кафки', '', '', 'Японский 
прозаик Харуки Мураками получил престижную 
чешскую награду в области литературы - 
премию Франца Кафки, сообщает AFP. 
\r\nНаграда, учрежденная в 2001 году, была 
вручена Мураками на торжественной 
церемонии, состоявшейся в столице Чехии - 
Праге. ', 'Японский прозаик вышел в 1987 
году и вскоре стал международным 
бестселлером. Среди других известных 
произведений автора - "Охота на овец", 
"Dance, dance, dance" и "Хроники заводной 
птицы". \r\nВ Японии писателя 
недолюбливают, считая его слишком 
"американизированным" и не пропагандирующим 
истинную японскую культуру.', '', '', 6, 
'2007-05-10 19:52:23', 0, 0, 0);
INSERT INTO `news` (`id`, `title`, 
`subtitle`, `icon`, `short_mess`, 
`full_mess`, `author`, `url_author`, 
`category`, `data`, `status`, `comments`, 
`news_read`) VALUES (3, 'Мичуринцы 
отравились суррогатным алкоголем', '', '', 
'Тридцать шесть человек, двадцать восемь 
мужчин и восемь женщин, находятся сейчас в 
больницах боярышника, "Антисептин", а также 
"зелье" неизвестного происхождения. 
\r\nВсего же по Тамбовской области, по 
данным на 30 октября, суррогатным алкоголем 
отравился 41 человек - в Жердевском, 
рейдовые проверки аптечных пунктов и всех 
мест, где производится продажа алкоголя. 
Кроме того, усилена разъяснительная работа 
среди населения области.', '', '', 5, '2007-05-10 19:52:57', 0, 0, 0);

   
 
 автор: Trianon   (10.05.2007 в 20:24)   письмо автору
 
   для: kis-kis   (10.05.2007 в 19:53)
 

данных в news Вы явно пожалели. показали бы строк 50... из разных разделов.
Но - прикрепив архив с дампом к сообщению.
Сейча попробую эту структуру воспроизвести.

   
 
 автор: Trianon   (10.05.2007 в 20:58)   письмо автору
 
   для: kis-kis   (10.05.2007 в 19:53)
 

Так. Собственно, уже всё ясно. От третьего запроса можно избавиться.
Вместо него можно перемотать на начало поток ответа второго запроса - они ж одинаковы.
фактически вместо строк

<?php
$query_inews 
"SELECT * FROM news WHERE category = '$news_cat[id]' order by data DESC limit 1";
$result_inews=mysql_query($query_inews) or die("<B>Error ".mysql_errno()." :</B> ".mysql_error()."");
if (
mysql_num_rows($result_inews)!=0)
{
while(
$inews mysql_fetch_array($result_inews))
{

можно поставить

<?php
if (mysql_num_rows($result_news)!=0)
{
  
mysql_data_seek($result_news);
  
$inews mysql_fetch_array($result_news))
{

   
 
 автор: Trianon   (10.05.2007 в 21:04)   письмо автору
 
   для: Trianon   (10.05.2007 в 20:58)
 

Избавиться от второго запроса и вывести всё вообще единственным запросом (не создав при этом изрядной нагрузки на сервер БД) куда сложнее. У меня не получилось .

   
 
 автор: kis-kis   (10.05.2007 в 21:12)   письмо автору
 
   для: Trianon   (10.05.2007 в 21:04)
 

Спасибо. Сейчас попробую...)

   
Rambler's Top100
вверх

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