tiny ‘n’ smart
database layer

Odkazy: dibi | API reference

Oznámení

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

Skládaný select a poddotaz

před 10 lety

tr.
Člen | 79

Ahoj, narazil jsem na jeden limit skládaných query, zadám ji takhle:

$res = dibi::select("* FROM contacts")
          ->where("[id_user] = %i", $user->getIdentity()->id)
          ->where("[subscribed] = TRUE")
          ->where("id IN (select id_contact from contacts_to_tags where id_tag = %i", $tag_id)
          ->offset($offset)->limit($limit)->execute();

A ono se to přeloží takhle:

SELECT *
FROM contacts
WHERE `id_user` = 1 AND `subscribed` = TRUE AND id IN (
select id_contact
from contacts_to_tags
where id_tag = 12
LIMIT 30 OFFSET 0

Ten vnořený select úplně zmizel až na úvodní závorku. Nevíte jak se to řeší?

S pozdravem Tomáš

před 10 lety

kravčo
Člen | 723

Na takéto dopyty je možno lepšie skúsiť to bez dibi fluent, ten má predsa len isté obmedzenia… Myslím, že ním zas až tak veľa písania neušetríš…

$res = dibi::query('
    SELECT *
    FROM [contacts]
    WHERE [id_user] = %i', $user->identity->id, '
      AND [subscribed] = %b', TRUE, '
      AND [id] IN ( SELECT [id_contact]
                    FROM [contacts_to_tags]
                    WHERE id_tag = %i', $tag_id, '
                  )
    LIMIT %lmt', $limit, '
    OFFSET %ofs', $offset, '
');

před 10 lety

tr.
Člen | 79

Ano ano, takhle to řeším. šlo mi o to, že ta má query je ve skutečnosti trochu oIFovaná a je daleko elegentnější přidávat funkce než sčítat řetézce. Pro tenhle report jsem ty ify odstranil.

před 10 lety

kravčo
Člen | 723

V tom prípade by mohlo fungovať:

$res = dibi::select('*')
    ->from('contacts')
    ->where('[id_user] = %i', $user->identity->id)
    ->where('[subscribed] = %b', TRUE)
    ->where('[id] IN (%SQL)',
        dibi::select('id_contact')
            ->from('contacts_to_tags')
            ->where('[id_tag] = %i', $tag_id)
            ->__toString()
    )
    ->offset($offset)
    ->limit($limit)
    ->execute();

před 10 lety

tr.
Člen | 79

Dekuju!