tiny ‘n’ smart
database layer

Odkazy: dibi | API reference

Oznámení

Omlouváme se, provoz fóra byl ukončen

Jak na INSERT SELECT?

před 10 lety

LastHunter
Člen | 1539

Ahoj,
potřeboval bych v dibi nějak složit dotaz pro vložení nového záznamu při traverzování kolem stromu, jak radí Jakub Vrána.

A neumím zkrátka složit dotaz pro INSERT SELECT, který vypadá takto:

INSERT INTO strom (lft, rgt, hloubka)
    SELECT IFNULL(MAX(rgt), 0) + 1,
           IFNULL(MAX(rgt), 0) + 2,
               0
        FROM strom

Rád bych využil featury dibi, tzn. pole apod., jasně, že můžu zřetězit řetězce, ale to nechci…

Tohle mi nefunguje:

$request = Environment::getHttpRequest();

        $this->db->test('INSERT INTO [::' . self::POSTS_TABLE . ']', array(
                'lft%sql' => 'SELECT IFNULL(MAX(rgt), 0) + 1',
                'rgt%sql' => 'IFNULL(MAX(rgt), 0) + 2',
                'level' => 0,
                'primary_id' => $this->primaryId,
                'table' => $this->table,
                'user_id' => $name==NULL ? $user->id : NULL,
                'username' => $name==NULL ? $user->name : $name,
                'ip_address' => $request->getRemoteAddress(),
                'user_agent' => $request->getHeader('user-agent'),
                'time' => time(),
                'text' => $text,
        ), '%sql', 'FROM [::' . self::POSTS_TABLE . ']');

Vygeneruje něco takového:

INSERT INTO `trance_posts` (
SELECT IFNULL(MAX(rgt), 0) + 1, IFNULL(MAX(rgt), 0) + 2, 0, '2', 'articles', NULL, 'sdasd',
'127.0.0.1', 'Mozilla/5.0 (Windows; U; Windows NT 6.1; cs; rv:1.9.1.3) Gecko/20090824
Firefox/3.5.3', 1256282379, 'asdasdasdasdasdas')
FROM `trance_posts`

Editoval LastHunter (23. 10. 2009 9:21)

před 10 lety

phx
Člen | 652

Priprav si onen select a pak to predhod insertu jako subdotaz.

před 10 lety

David Grudl
Nette Core | 6806

Trošku OT: dej pozor, abys pro sloupec user_agent měl nastaven typ binary.

před 10 lety

phx
Člen | 652

Binary? User_agent muze obsahovat binarni data? Ja myslel ze to je proste text (podpis prohlizece).