Всем доброго времени суток! Прошу помощи в следующей задаче: Есть две таблицы в БД "groups" и "hodo1". В таблице groups находятся заголовки для будущких колонок таблицы. У groups есть строки в БД category_id(auto increment) и name(название группы). В таблице hodo1 есть link(auto_increment) category_id(сюда вписывается значение category_id из groups) name и url(для создания href, имя и ссылка). В настоящее время есть 19 групп и к каждой группе принадлежит от 20 до 70 ссылок(сортировка по category_id) в таблице hodo1. Моя задача компактно отобразить на web странице таблицу,где в ряду таблицы будет по 3 колонки. Т.е. заголовок 1,2,3 из таблицы groups и все линки, которые есть в hodo1 с соответсвующим category_id=1,2,3. Далее пойдет вторая таблица с тремя следующими заголовками и всеми линками(category_id 4,5,6). Прикладываю код, который работает без ошибок, однако он выводит все столбцы в один ряд. Никак не могу понять, как наложить правильный цикл так, чтобы выводилось именно по 3 столбца в один ряд до тех пор, пока количество строк groups существуют. Заранее спасибо! PHP: <?php $i=0; $cat_id_groups = array(); $conn = mysqli_connect($servername, $username, $password, $database); $result = $conn->query("SELECT name FROM groups"); $for_groups="SELECT category_id FROM groups"; $cat_ids= mysqli_query($conn, $for_groups); $counter=mysqli_num_rows($cat_ids); while($cat_id = mysqli_fetch_assoc($cat_ids)) { $category_id_groups = $cat_id['category_id']; $cat_id_groups[$i] = $category_id_groups; $i++; } echo "<table cols=3 border=0 cellspacing=0 cellpadding=0 width=1000"; echo "<tr>"; while (list($name) = $result->fetch_array()) { echo " <td>$name</td>\n" ; } echo "</tr><tr>"; for($k=0;$k<$counter;$k++) { $main="SELECT * FROM hodo1 WHERE category_id=$cat_id_groups[$k] ORDER BY sort"; $result1= mysqli_query($conn, $main); echo "<td>"; while($row = mysqli_fetch_row($result1)){ echo "<a href=$row[1]>$row[3]</a><br>"; } } echo "</td></tr>"; echo "</table>"; ?>
Добрый вечер! Спустя время вновь вернулся к этой задаче и выполнил. Оставлю здесь код, вдруг кому пригодится. Сделал 2 функции. Одна выводит имя группы из таблицы groups. Вторая функция выводит URL и его имя из таблицы hodo1. Далее загнал в массив все category_id из таблицы groups и на их основании через циклы сделал таблицу, которая выводит по три колонки до тех пор, пока цикл не превысит количества всех строк в таблице groups, деленных на три(так как по 3 колонки выводит). Также использовал ceil, чтобы округление шло в бОльшую сторону, иначе последние колонки код бы не вывел. Да, пришлось заглушить вывод ошибок, так как бывает ситуация, что в последнеем выводе есть только одна колонка, которую тоже нужно вывести. При такой ситуации в код вбрасывается два несуществующих в БД category_id и вылезает ошибка. P.S. Если кто сможет посоветовать, что можно подправить, то буду очень признателен. PHP: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> </head> <body> <?php $servername = "localhost"; $database = "hodo"; $username = "root"; $password = ""; $conn = mysqli_connect($servername, $username, $password, $database); error_reporting(0); ini_set('display_errors', 0); function groups_id($category_id) { $servername = "localhost"; $database = "hodo"; $username = "root"; $password = ""; $conn = mysqli_connect($servername, $username, $password, $database); $groups= "SELECT * FROM groups WHERE category_id=$category_id"; $groups_res= mysqli_query($conn, $groups); while($row = mysqli_fetch_assoc($groups_res)) { echo $row['name']; } } function links_id($category_id) { $servername = "localhost"; $database = "hodo"; $username = "root"; $password = ""; $conn = mysqli_connect($servername, $username, $password, $database); $links= "SELECT * FROM hodo1 WHERE category_id=$category_id ORDER BY sort"; $links_res= mysqli_query($conn, $links); while($lingid= mysqli_fetch_assoc($links_res)) { echo "<a href=$lingid[url]>$lingid[name]</a><br>"; } } $groups_sum= "SELECT category_id FROM groups ORDER BY sort"; $groups_all= mysqli_query($conn, $groups_sum); $all=mysqli_num_rows($groups_all); $array = Array(); while($numbers= mysqli_fetch_assoc($groups_all)) { $array[]=$numbers['category_id']; } $a=0;$b=2; for($d=1;$d<=ceil($all/3);$d++) { echo "<table><tr>"; for($i=$a;$i<=$b;$i++) { echo "<td>"; echo groups_id($array[$i]); echo "</td>"; } echo "</tr><tr>"; for($k=$a;$k<=$b;$k++) { echo "<td>"; echo links_id($array[$k]); echo "</td>"; } echo "</tr>"; echo "</table>"; $a=$a+3; $b=$b+3; } ?> </body> </html>
Добрый день, Таблица groups: category_id(INT,PK,AI), sort(INT,NN), name(varchar) Таблица hodo1: link(INT,PK,AI), category_id(INT), sort(INT,NN), name(varchar), url(varchar) Пример таблицы groups: category_id sort name 1 1 Abisaatjad1 2 2 Abisaatjad2 3 3 Abisaatjad3 4 4 Abisaatjad4 5 5 Abisaatjad5 6 6 Abisaatjad6 Пример таблицы hodo1: link category_id sort name url 2 1 2 link1 http:// 3 1 3 link2 http:// 4 2 4 link3 http:// 5 2 5 link4 http:// 6 3 7 link5 http:// 7 3 8 link6 http:// 8 1 4 link7 http:// 9 1 5 link8 http:// 10 3 9 link9 http:// Как это работает с точки зрения пользователя(добавление,замена, удаление происходит не в БД, а на страничках php). Создается новая группа, AI присваивает новый category_id. После создаются линки в таблице hodo1, где category_id переносится из таблицы groups конкретной группы в таблицу hodo1(на этом основана связка, чтобы потом вытащить группу и все линки, принадлежащие к группе). sort в обеих таблицах используется для того, чтобы пользователь сам мог выбрать,в каком конкретном месте будет отображаться группа и в какой последовательности будут висеть сами линки для группы. В настоящей таблице порядка 40 групп и около 600 линков, поэтому менять логику таблиц достаточно сложно. Пример(без стилей):
Попробуйте сначала вот такой запрос Код (Text): SELECT * FROM `groups` JOIN `hodo1` USING ( `category_id` ) ORDER BY `groups`.`name` ASC
Огромное спасибо! Про JOIN я, честно говоря, просто не знал...От слова совсем Теперь смогу еще лучше оптимизировать. P.S. Первый вариант вывода из БД был таков, что я к каждой группе и линкам делал отдельный запрос...код получился на 2000+ строк
Это только SQL. Отладьте его в phpMyAdmin, добившись именно той выдачи, которая требуется. Почитайте про объединения таблиц и выборок, сортировки, группировки... И только после этого переходите к PHP. Там у вас тоже есть что оптимизировать. Получите выборку в массив и обращайтесь с ним в форум.