X   Сообщение сайта
(Сообщение закроется через 3 секунды)



 

Здравствуйте, гость (

| Вход | Регистрация )

Открыть тему
Тема закрыта
> помогите оптимизировать запрос в бд
LifeUP
LifeUP
Topic Starter сообщение 6.5.2010, 14:42; Ответить: LifeUP
Сообщение #1


Всем привет!

[PHP]
CREATE TABLE `subcategories` (
`ids` int(4) NOT NULL auto_increment,
`id` int(3) NOT NULL default '0',
`nameSubCategories` varchar(40) default NULL,
`link` varchar(40) default NULL,
PRIMARY KEY (`ids`)
) ENGINE=MyISAM AUTO_INCREMENT=363 DEFAULT CHARSET=cp1251;
[/PHP]


[PHP]
CREATE TABLE `categories` (
`idCategories` int(3) NOT NULL auto_increment,
`nameCategories` varchar(40) default NULL,
`idSubCat` int(3) default NULL,
`link` varchar(40) default NULL,
PRIMARY KEY (`idCategories`)
) ENGINE=MyISAM AUTO_INCREMENT=43 DEFAULT CHARSET=cp1251;

[/PHP]


[php]
$result = $db->query ("SELECT idSubCat,nameCategories FROM `categories` ORDER BY nameCategories");

if ($db->num_row ($result) > 0)
{
$spisok = "
\n<select class='inp_1' id='category' name='categories'>\n
<option value=''>-- выберите категорию --</option>\n";

while ($myrow = $db->fetch_array ($result))
{
$spisok .= "<optgroup label='" . $myrow['nameCategories'] . "'>\n";

$result_1 = $db->query ("SELECT ids,nameSubCategories FROM `subcategories` WHERE id = '" . $myrow['idSubCat'] . "' ORDER BY nameSubCategories");
if ($db->num_row ($result_1) > 0)
{
while ($myrow_1 = $db->fetch_array ($result_1))
{
$spisok .= "<option value='" . $myrow_1['ids'] . "'>" . $myrow_1['nameSubCategories'] . "</option>\n";
}
}
$spisok .= "</optgroup>\n";
}
$spisok .= "</select>\n";
}

[/php]

Общее количество MySQL запросов на странице 46, можно както его оптимизировать?
0
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Mulder_hb
Mulder_hb
сообщение 20.5.2010, 0:52; Ответить: Mulder_hb
Сообщение #2


Во-первых, более качественно проработать структуру обоих таблиц: удалить лишние поля, создать внешний индекс из дочерней таблицы в родительскую. То, что тут представлено, никуда не годиться.
А уже потом сделать один единственный запрос в бд с левосторонним соединением, разложить полученный результат в двумерный массив и работать уже с ним в цикле for. Если все еще актуально можно и расписать...
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
LifeUP
LifeUP
Topic Starter сообщение 20.5.2010, 20:36; Ответить: LifeUP
Сообщение #3


хм... интересно почему структура таблицы неудачная?
Хотелось бы увидеть ваш способ.
P.S оптимизировал кот путём занесения обоих таблиц в разные массивы с последующим разбором их.
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Mulder_hb
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
LifeUP
Topic Starter сообщение 27.5.2010, 13:43; Ответить: LifeUP
Сообщение #5


спасибо за разьяснения, буду вникать.

Замечание модератора:
Эта тема была закрыта автоматически ввиду отсутствия активности в ней на протяжении 100+ дней.
Если Вы считаете ее актуальной и хотите оставить сообщение, то воспользуйтесь кнопкой
или обратитесь к любому из модераторов.
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Открыть тему
Тема закрыта
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0


Свернуть

> Похожие темы

  Тема Ответов Автор Просмотров Последний ответ
Открытая тема (нет новых ответов) Запрос на бесплатные полезности
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-


 



RSS Текстовая версия Сейчас: 19.4.2024, 2:46
Дизайн