Database Explorer a subquery v MariaDb
- fero.peterko
- Člen | 3
Ahoj, měl bych dotaz ohledně subquery nad MySQL při použití Nette
Database Explorer. Pokud definuji dotaz stylem
$query->where('column', $subquery)
, provedou se dva dotazy typu
SELECT * FROM table WHERE column IN (1, 2, 3)
. To vše funguje
dobře, ale dostal jsem do situace, kdy v operátor IN dostane jako parametr
velké množství hodnot (řádově tisíce). Celý dotaz poté končí
timeoutem.
Po hlubším prozkoumání se v případě, že DB driver podporuje
poddotazy (konstanta SUPPORT_SUBSELECT
), což MySQL driver
podporuje od verze 5.7, se provede dotaz jako subquery tedy typu
SELECT * from table WHERE column IN (SELECT value FROM other_table)
.
Pokud výše uvedený problém provedu jako poddotaz vše proběhne
„hladce“.
Nyní k problému: používám MariaDB 10.4.13, nicméně atribut
\PDO:ATTR_SERVER_VERSION
vrací hodnotu 5.5.5–10.4.13-MariaDB
namísto 10.4.13-MariaDB. Tím pádem MySQL Driver detekuje, že databáze
nepodporuje subqueries, a následně se dotaz řeší formou 2 samostatných
dotazů. Důvodem pravděpodobně chybné detekce je, že driver vyžaduje verzi
MySQL 5.7, ale PDO pro MariaDb vrací prefix 5.5.
To mě přivádí k otázce, jestli v MySQL Driveru není chyba právě v případě použití MariaDb?
Subquery jsem do Nette Database Explorer vnutil následujícím způsobem níže. Není cílem řešit, zda by v konkrétní situaci bylo vhodnější použít třeba JOIN, nebo zapisovat dotaz přímo pomocí SQL atd. Jde mi o uvedenou problematiku poddotazu v Database Explorer.
$subquery = $explorer->table('other_table')->where(....);
$result = $explorer->table('table')->where("column IN ({$subquery->getSql()})", $subquery->getSqlBuilder()->getParameters());
- Simtrix
- Člen | 15
V dokumentaci na https://doc.nette.org/…ase/explorer je napsáno
$table->where('field', $explorer->table($tableName)->select('col'))
Pro tvůj případ bych tedy zkusil
$subquery = $explorer->table('other_table')->select('col')->where(....);
$result = $explorer->table('table')->where('column IN', $subquery);