Database Explorer a subquery v MariaDb

fero.peterko
Člen | 3
+
0
-

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
+
0
-

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);