Помощник
|
помогите оптимизировать запрос в бд |
LifeUP
|
Сообщение
#1
|
||
|
|
||
|
|||
Mulder_hb |
20.5.2010, 0:52;
Ответить: Mulder_hb
Сообщение
#2
|
|
Во-первых, более качественно проработать структуру обоих таблиц: удалить лишние поля, создать внешний индекс из дочерней таблицы в родительскую. То, что тут представлено, никуда не годиться.
А уже потом сделать один единственный запрос в бд с левосторонним соединением, разложить полученный результат в двумерный массив и работать уже с ним в цикле for. Если все еще актуально можно и расписать... |
|
|
LifeUP
|
Сообщение
#3
|
|
хм... интересно почему структура таблицы неудачная?
Хотелось бы увидеть ваш способ. P.S оптимизировал кот путём занесения обоих таблиц в разные массивы с последующим разбором их. |
|
|
Mulder_hb |
21.5.2010, 0:04;
Ответить: Mulder_hb
Сообщение
#4
|
|
Это классический пример, который содержит любая уважающая себя книжка по базам данных.
Ваша таблица categories должна, по идеи, быть родительской. Зачем тогда в ней ссылка на дочернию таблицу в виде поля idSubCat? Избыточность, которая приведет к разрастанию родительской таблицы в зависимости от дочерней. Тем больше подкатегорий, тем жирнее будет таблица категорий. Такого быть не должно. Должно быть так: CREATE TABLE IF NOT EXISTS `categories` ( `idcat` INT(3) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'Category Identifier', `namecat` VARCHAR(40) DEFAULT '' COMMENT 'Category Name', `link` varchar(40) DEFAULT '' COMMENT '???', PRIMARY KEY (`idcat`) ) ENGINE=MyISAM DEFAULT CHARSET=cp1251 COMMENT='Category Table'; Дочерняя таблица должна содержать связь с родительской таблицей. Т.е. должен быть определен внешний ключ, для которого желательно указать, что делать с дочерней таблицей при изменение данных в родительской. Я предположу действие SET DEFAULT для действия DELETE. Определять действие UPDATE не имеет смысла для инкрементируемого столбца (будет использоваться значение по умолчанию RESTRICT): CREATE TABLE IF NOT EXISTS `subcategories` ( `idsubcat` INT(4) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'SubCategory Identifier', `cat_id` INT(3) NOT NULL DEFAULT '0' COMMENT 'Category Identifier', `namesubcat` VARCHAR(40) DEFAULT '' COMMENT 'SubCategory Name', `link` varchar(40) DEFAULT '' COMMENT '???', PRIMARY KEY (`idsubcat`), FOREIGN KEY (`cat_id`) REFERENCES `categories` (`idcat`) ON DELETE SET DEFAULT ) ENGINE=MyISAM DEFAULT CHARSET=cp1251 COMMENT='SubCategory Table'; ПХП код не проверял, возможно требует правки: [php]$result = $db->$query("SELECT `c`.`idcat`,`c`.`namecat`,`s`.`idsubcat`,`s`.`namesubcat`,`s`.`cat_id` FROM `categories` AS `c` LEFT JOIN `subcategories` AS `s` ON `c`.`idcat` = `s`.`cat_id` ORDER BY `c`.`idcat`"); for ($data = array(); $row = mysql_fetch_assoc($result); $data[] = $row); $list = ' <select name="categories"> <option value="">-- выберите категорию --</option> '; for ($i = 0; $i < count($data); $i++) { $list .= '<optgroup label="'.$data[$i]["namecat"].'">'; for ($y = $i; $y < count($data); $y++) { if ($data[$y]['cat_id'] != $data[$i]['idcat']) break; $list .= '<option value="'.$data[$y]["idsubcat"].'">'.$data[$y]["namesubcat"].'</option>'; } $list .= '</optgroup>'; } $list .= '</select>';[/php] |
|
|
LifeUP
|
Сообщение
#5
|
|
|
спасибо за разьяснения, буду вникать.
|
|
|
||
|
Похожие темы
Тема | Ответов | Автор | Просмотров | Последний ответ | |
---|---|---|---|---|---|
Запрос на бесплатные полезности | 7 | Tia2 | 1957 | 23.3.2024, 11:27 автор: Alexand3r |
|
Помогите вспомнить рекламного бота Телеграм для обмена рекламой | 0 | Mixatraider | 725 | 21.2.2024, 23:42 автор: Mixatraider |
|
Помогите рещить проблему с монитором. Почему низкое разрешение при подключении монитора через displayport? |
0 | Levels | 1702 | 11.12.2020, 0:48 автор: Levels |
|
Помогите кто нибудь получить партнерку Росбанк! | 7 | heisenberg_mw | 2340 | 7.8.2020, 9:28 автор: heisenberg_mw |
|
Помогите найти тему пожалуйста | 7 | virtas | 12463 | 24.7.2020, 17:02 автор: -JamesSmips- |
Текстовая версия | Сейчас: 19.4.2024, 2:46 |