Показать сообщение отдельно
  #10 (permalink)  
Старый 25.11.2016, 02:46
St. St. вне форума
Аспирант
Отправить личное сообщение для St. Посмотреть профиль Найти все сообщения от St.
 
Регистрация: 15.04.2016
Сообщений: 53

Цитата:
Дело не в Ассемблере, а в запросах к базе, это вы понимаете? Если писать традиционно, как это и делается, то это будут рекурсивные запросы к базе.
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;
}


П.С.
Вы неправильно батон крош... Ну это, ломаете...
Надеюсь, админы не удалят мою писанину...

Последний раз редактировалось St., 25.11.2016 в 03:01.
Ответить с цитированием