1. SQL / Говнокод #25360

    +2

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    8. 8
    CREATE TABLE `test` (
        `id` INT(11) unsigned NOT NULL AUTO_INCREMENT,
         `parent` INT(10) unsigned NOT NULL DEFAULT '0',
          `name` VARCHAR(50),
         PRIMARY KEY (`id`)
        ) ENGINE=InnoDB;
    INSERT INTO test (id, parent, name) values (1, 0, '10'),(2, 1, '21'),(4, 3, '43'),(5, 0, '50'),(6, 5, '65'),(7, 6, '76'),(8, 7, '87'),(9, 8, '98');
    SELECT t1.name AS lev1, t2.name as lev2, t3.name as lev3, t4.name as lev4, t5.name as lev5, t6.name as lev6, t7.name as lev7 FROM `test` AS t1 LEFT JOIN test AS t2 ON t2.`parent` = t1.`id`  LEFT JOIN test AS t3 ON t3.`parent` = t2.`id`  LEFT JOIN test AS t4 ON t4.`parent` = t3.`id` LEFT JOIN test AS t5 ON t5.`parent` = t4.`id` LEFT JOIN test AS t6 ON t6.`parent` = t5.`id` LEFT JOIN test AS t7 ON t7.`parent` = t6.`id`;

    взять последнего парента с седьмого колена!
    я просто похлопаю :)

    Запостил: websbkinfo, 07 Февраля 2019

    Комментарии (19) RSS

    • Дереьвя надо или хранить в Left+Right (Nested Set Model) или выводить через Common Table Extensions

      остальное это пыхомускулевое доширакство
      Ответить
      • Именно поэтому я за «OQGRAPH»:
        https://mariadb.com/kb/en/library/oqgraph-overview/

        https://openquery.com.au/products/graph-engine
        Ответить
      • здесь не столь тяжелая структура и задача, чтобы делать Nested Sets
        Ответить
        • Тогда CTE

          но судя по вот этому вот "LEFT JOIN" это писал мускульщик, а он про CTE не знает
          Ответить
    • Бля, только щас узнал что в инсерт можно несколько записей указать... Я почти джва года писал на каждую запись отдельный инсерт...

      Какой багор (((
      Ответить
      • На всякий случай напоминаю, что можно ещё селектнуть кусок одной таблицы и вставить в другую одним запросом.
        Ответить
        • эдакое копирование :)
          Ответить
        • А из таблицы в неё же что будет?
          Ответить
          • эдакое дублирование гг :)
            Ответить
          • Пишут, что будет плохо:
            http://www.mysql.ru/docs/man/INSERT_SELECT.html
            Целевая таблица команды INSERT не должна появляться в утверждении FROM части SELECT данного запроса, поскольку в ANSI SQL запрещено производить выборку из той же таблицы, в которую производится вставка. (Проблема заключается в том, что операция SELECT, возможно, найдет записи, которые были внесены ранее в течение того же самого прогона команды. При использовании команд, внутри которых содержатся многоступенчатые выборки, можно легко попасть в очень запутанную ситуацию!)
            Ответить
            • Это всего лишь предупреждение, если выбрать поля без примарикей все виберется и все вставится!
              Ответить
            • while(true) тоже с умом надо юзать!
              Ответить

    Добавить комментарий