Oznámení
Omlouváme se, provoz fóra byl ukončen
Skládaný select a poddotaz
Upozornění: Tohle vlákno je hodně staré.
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!