Цитата:
|
Дело не в Ассемблере, а в запросах к базе, это вы понимаете? Если писать традиционно, как это и делается, то это будут рекурсивные запросы к базе.
|
MySQL не предназначен для подкатегорий! Нет у него команд для этого!
Для этого существуют другие субд!
Программа, которая написана вверху, мной была переписана на Си.
Что Вам сказать?
Цитата:
|
От такого третирования базы не спасет не Ассемблер ни что иное.
|
Вот, вот... Догадайтесь сами, что Вам можно сказать...
Метод
NESTED SETS, хорош для выбивания денег из любознательных.
Я мысленно прохожусь по порядку от 1 до 32 и не мого понять
кто будет обнавлят левый и правый ключ после добавления узла? Тема не раскрыта полностью. Писать автору я не буду, он может денег попросить.
Вот сама программа (см. ниже).
Ладно, шутки-шутками, а посуществу, программа написанная на PHP вверху, дохнет на 3000 категорий с десятком подкатегорий, плюс одна подкатегория имеет 30 вложенных подкатегорий. Так вот, на этих 30 подкатегориях время генерации странцы приблизительно 0.45 сек.
Что касается Си - скушал и не подавился...
Комп древней с установленной ОС FreeBSD.
Вот еще мысль: Ассемблер, Си, Js - браузерные шахматы.
Правда выиграть у компьютера невозможно...
// Это Си не путать с PHP.
#include <stdio.h>
#include <string.h>
#include <stdlib.h> // exit(1);
#define N 80
//
// Чтение двух столбцов текстового файла в два массива.
// Пример текстового файла:
// ... ...
// 234 560
// 103 789
// 456 232
// ... ...
//
int i = 0, k = 0, j =0 , j_1 = 0, j_2 = 0;
long int current_id_cat, current_id_cat_tmp;
long int array_branch_id_cat[8192];
long int array_new_branch_id_cat[8192];
int main(int argc, char* argv[])
{
// Получаем текущий идентификатор категории.
current_id_cat = atoi(argv[2]);
FILE *file = NULL;
// В argv[1] путь с именем файла идентификаторов.
file = fopen(argv[1], "r");
if(file == NULL)
{
// Ошибка открытия файла.
puts("Error opening file!");
exit(1); // Завершение с кодом ошибки 1.
}
char array_1[8192][N]; // id_cat.
char array_2[8192][N]; // parent_id.
char line[N];
while ( fgets (line, N, file) )
{
j_1 = 0; j_2 = 0; k = 0;
while(1)
{
// Останов, если нет пробела.
if (k > N) break;
// Останов, если найден пробел.
if (line[k] == ' ')break;
{
array_1[i][j_1] = line[k];
}
j_1++;
k++;
}
// Пропустить пробел.
k++;
while(1)
{
// Останов, если нет конца строки.
if (k > N) break;
// Останов, если найден конец сторки.
if (line[k] == '\n')break;
{
array_2[i][j_2] = line[k];
}
j_2++;
k++;
}
i++;
}
fclose(file);
// Решаем вопрос с веткой.
if (current_id_cat != 0)
{
// Находим ветку.
k = 0;
current_id_cat_tmp = current_id_cat;
for (j = 0; j < i; j++)
{
if (atoi(array_1[j]) == current_id_cat_tmp)
{
// id_cat'ы в массив array_branch_id_cat[].
array_branch_id_cat[k] = current_id_cat_tmp;
k++;
// Родитель.
current_id_cat_tmp = atoi(array_2[j]);
if (current_id_cat_tmp != 0)
{
// Нет, ещё не все.
j = 0;
}
else
{
// Все id_cat'ы уже в массиве,
// в такой последовательности: 54321;
array_branch_id_cat[k] = current_id_cat_tmp;
k++;
// Поменять местами 54321 на 12345.
i = 0;
for (j = k-1; j >= 0; j--)
{
array_new_branch_id_cat[i] = array_branch_id_cat[j];
i++;
}
// Вот они.
for (j = 0; j < k; j++)
// В вывод их, PHP потом их заберёт...
printf("%d\n", array_new_branch_id_cat[j]);
// Всё.
break;
}
}
}
}
else
{
// Текущий id_cat равен нулю.
// В вывод...
printf("%d\n", current_id_cat);
}
return 0;
}
П.С.
Вы неправильно батон крош... Ну это, ломаете...
Надеюсь, админы не удалят мою писанину...