Здравствуйте уважаемые, вот делаю нечто подобное сайту berloga.net, ниже приведен код одного блока. Написал, все работает так как я и хотел, но меня терзают смутные сомнения об оптимальности кода который выводит название и категории. Пожалуйста оцените, и дайте советы по оптимизации. Заранее спасибо. PHP: <?php $result = mysql_query ("SELECT * FROM data ORDER BY date DESC",$db); while ($myrow = mysql_fetch_array($result)) { $res = mysql_query ("SELECT cat.title, cat.cat_id FROM cat, relation WHERE relation.data_id='$myrow[data_id]' AND cat.cat_id=relation.cat_id ORDER BY parent_id",$db); $row = mysql_fetch_array ($res); echo "<table class='data_table' width='100%' border='0'> <tr> <td class='data_header'><span class='data_name'>". $myrow['name'] ."</span> | <a class='a_data' href = cat.php?cat_id=". $row['cat_id'] .">". $row['title'] ."</a> | "; $row = mysql_fetch_array ($res); echo "<a class='a_data' href = cat.php?cat_id=". $row['cat_id'] .">". $row['title'] ."</a>"; while ($row = mysql_fetch_array ($res)) {echo ", <a class='a_data' href = cat.php?cat_id=". $row['cat_id'] .">" . $row['title'] ."</a>";} echo " </span></td> </tr> <tr> <td><div align='center' valign='center'><a href='detail.php?data_id=". $myrow['data_id'] ."'><img src='". $myrow['foto'] ."' alt'". $myrow['alt'] ."'/></a><div></td> </tr> <tr> <td><div align='left'>". $myrow['description'] ."</div></td> </tr> <tr> <td class='data_footer' valign='center'> <table width='100%' border='0'> <tr> <td><div align='left'><a href='detail.php?data_id=". $myrow['data_id'] ."' class='a_data'>Читать дальше</a></div></td> <td><div align='right' class='comments'>| Просмотров: | Коментарии: | ". date("d.m.Y",strtotime($myrow['date'])) ."</div></td> </tr> </table> </td> </tr> </table>"; } ?>
cat.php можно переименовать в $_SERVER['PHP_SELF'], чтобы если понадобиться изменить название файла не менять код.
Да запросов он делает много, если точнее то mysql_num_rows ($result) +1, а это будет очень много со временем, но я не знаю как объеденить запрос, что бы потом внутри одного цикла выводить другой цикл, который выводит все категории, количество которых непостоянное.. нагородил вот так, но проблема осталась: PHP: <?php $result = mysql_query ("SELECT * FROM data, cat, relation WHERE relation.data_id=data.data_id AND cat.cat_id=relation.cat_id ORDER BY date DESC",$db); while ($myrow = mysql_fetch_array($result)) { echo "<table class='data_table' width='100%' border='0'> <tr> <td class='data_header'><span class='data_name'>". $myrow['name'] ."</span> | <a class='a_data' href = cat.php?cat_id=". $myrow['cat_id'] .">". $myrow['title'] ."</a>/*Вот здесь нужно как-то цикл организовать, а при таком запросе я не знаю как.. */ | "; echo " </span></td> </tr> <tr> <td><div align='center' valign='center'><a href='detail.php?data_id=". $myrow['data_id'] ."'><img src='". $myrow['foto'] ."' alt'". $myrow['alt'] ."'/></a><div></td> </tr> <tr> <td><div align='left'>". $myrow['description'] ."</div></td> </tr> <tr> <td class='data_footer' valign='center'> <table width='100%' border='0'> <tr> <td><div align='left'><a href='detail.php?data_id=". $myrow['data_id'] ."' class='a_data'>Читать дальше</a></div></td> <td><div align='right' class='comments'>| Просмотров: | Коментарии: | ". date("d.m.Y",strtotime($myrow['date'])) ."</div></td> </tr> </table> </td> </tr> </table>"; } ?>
Короче тебе надо выбрать одним запросом, чтобы получилось чтото типа: data1 => cat_name1 data1 => cat_name2 data1 => cat_name3 data2 => cat_name0 data2 => cat_name1 data2 => cat_name3 data3 => cat_name7 data4 => NULL data5 => cat_name0 ? Так я понимаю?
чтото типа: [sql] SELECT t1.data_name, t2.cat_name FROM data AS t1, cat AS t2 WHERE cat_id=( SELECT cat_id FROM relation WHERE data_id=( SELECT data_id FROM data LIMIT 0, 10)) [/sql] но я не уверен, может с UNION или JOIN надо както!?
нет, это маразм надо так: [sql] SELECT t1.data_name, t3.cat_name FROM data AS t1, relation AS t2, cat AS t3 WHERE t2.data_id = t1.data_id AND t2.cat_id = t3.cat_id LIMIT 0, 10 [/sql] вроде должно, можно попробывать с JOIN но не могу сообразить. Мож тут есть получше умы?
[sql] SELECT t1.data_name, t2.cat_name FROM DATA AS t1 LEFT JOIN relation AS t3 ON t1.data_id = t3.data_id LEFT JOIN cat AS t2 ON t2.cat_id = t3.cat_id LIMIT 0 , 10 [/sql]
так при этом [sql] SELECT SQL_CALC_FOUND_ROWS t1.data_name, t2.cat_name FROM data AS t1 LEFT JOIN relation AS t3 ON t1.data_id = t3.data_id LEFT JOIN cat AS t2 ON t2.cat_id = t3.cat_id LIMIT 0 , 10; SELECT FOUND_ROWS( ) ; [/sql] выдаст 8, но всего та допустим записей в дата 5 штук. Как узнать действительное число? знает может кто?