оптимизация sql запроса

artbur

Новичок
оптимизация sql запроса

Условно говоря, есть таблица catalog с полями catalog_id, catalog_parent, catalog_name
Задача - вытащить из каталога все записи, у которых есть "подтовары".

Можно ли каким-то образом упростить/оптимизировать этот запрос, чтобы к базе обращаться только один раз?

PHP:
	$result=mysql_query("select catalog_id, catalog_name from catalog order by catalog_name");

	if ($data=mysql_fetch_assoc($result)) {
		while (list($key, $value)=each($data))
			$$key=check_string($value);

		$result2=mysql_query("select catalog_id from catalog where catalog_parent='".$catalog_id."'");
		if (mysql_num_rows($result2)) {
			echo catalog_name."<br>\n";
		}
	}
Заранее спасибо за ответ.
Надеюсь понятно сформулировал.
 

Wicked

Новичок
1.
Код:
while (list($key, $value)=each($data))
  $$key=check_string($value);
- вроде то же самое, что и
Код:
extract($data, EXTR_OVERWRITE)
В любом случае так делать не надо.

2. Я вообще сомневаюсь, что твой скрипт работает. То, что он (на вид) делает, это: выбирает все из каталога запросом. Из результата берет первую запись и для нее проверяет, есть ли у нее дети. Так что приведи его сначала в рабочий вид, а потом поговорим об оптимизации.
 

artbur

Новичок
Прошу прощения. Так будет правильнее.

PHP:
	$result=mysql_query("select catalog_id, catalog_name from catalog order by catalog_name");
	while ($data=mysql_fetch_assoc($result)) {
		extract($data);

		$result2=mysql_query("select catalog_id from catalog where catalog_parent='".$catalog_id."'");
		if (mysql_num_rows($result2)) {
			echo $catalog_name."<br>\n";
		}
	}
 

Wicked

Новичок
ну вот, так лучше.

Сделать одним запросом это можно. Для этого тебе понадобится знание конструкциий INNER JOIN и GROUP BY. Джоинить таблицу нужно саму к себе.
 

artbur

Новичок
Ок, спасибо буду разбираться.

Вдогонку вопрос по поводу функции extract. Когда я переприсваиваю значения из массива таким образом
PHP:
while (list($key, $value)=each($data)) 
   $$key=check_string($value);
я каждое значение пропускаю через функцию check_string
PHP:
function uncheck_string ($string) {
  $string=str_replace("&gt;",">",$string);
  $string=str_replace("&lt;","<",$string);
  $string=stripslashes($string);
  return $string;
}
Можно ли каким-то образом реализовать это же в конструкции extract($data) ?
 

Wicked

Новичок
$$key=check_string($value);
function uncheck_string ($string) {
дай правильную

-~{}~ 27.05.08 17:15:

хотя, если она делает обратное действие, то у меня такие соображения:
1) Данные, достанные из базы, не нужно прогонять на этапе их извлечения ни через аналог htmlspecialchars, ни через addslashes.
2) Если тебе данные нужно выводить в HTML, то используй htmlspecialchars на этапе составления html, а не при извлечении из базы.
3) Если тебе данные нужно переиспользовать в SQL, то используй mysql_real_escape_string, причем опять же, на этапе составления SQL-запроса, а не при извлечении из базы.
4) как я уже говорил, присвоение вида "$$key =" и функция escape() - вредны. Они ухудшают понятность кода.

-~{}~ 27.05.08 17:16:

http://phpfaq.ru/slashes
 
Сверху