Where – in na více sloupcích

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
nn2
Člen | 9
+
0
-

Ahoj,
potřeboval bych radu, jestli je možný nějaký zápis výběru hodnot se subdotazem na více sloupcích. Kód asi bude názornější

<?php
$ref = $database->table('a')->select('a, b')->group('a');
$res = $database->table('b')->where('a, b', $ref);
?>

Problém je v tom, že potřebuju, aby se mi dotaz přeložil na SELECT FROM b WHERE (a,b) IN (?,?) …, ale v současné implementaci se to překládá špatně, MySQL hlásí Cardinality error (nebo něco takového).

Ve zdroji SqlBuilder jsem si to opravil, a jde mi o to, jestli to nejde napsat za pomoci stávajících „nástrojů“.

Zkoušel jsem i

<?php
$res = $database->table('b')->where(array('a', 'b'), $ref);
?>

, to je ale určené k něčemu jinému.

Díky.

llook
Člen | 407
+
0
-

Jen tak od boku bych tipnul ->where('(a, b)', $ref);.

Patrik Votoček
Člen | 2221
+
0
-

co takhle:

$res = $database->table('b')->where(array('a' => $ref['a'], 'b' => $ref['b']));

nebo

$res = $database->table('b')->where(iterator_to_array($ref)); // tady si nejsem úplně 100 jistej

nebo

$res = $database->table('b')->where('a = ? AND b = ?', $ref['a'], $ref['b']);
nn2
Člen | 9
+
0
-

llook napsal(a):

Jen tak od boku bych tipnul ->where('(a, b)', $ref);.

Tohle jsem zkoušel, to nefunguje.

nn2
Člen | 9
+
0
-

Chtěl jsem se tomu vyhnout, a maximálně využít jednoduchost zápisu. Udělal jsem na to hack v SqlBuilderu, aby to tak šlo psát, https://github.com/…tte/pull/831, ale nevím, jestli se to dá včlenit ;)

A navíc, není to ta, že bych na $res musel zavolat ještě fetch? Chtěl bych aby mi byl sestaven správný dotaz, do něho pak Nette doplní data z $res, stejně, jako to funguje pro

$res = $database->table(...);
$rows = $database->table(...)->where('id', $res);

Patrik Votoček napsal(a):

co takhle:

$res = $database->table('b')->where(array('a' => $ref['a'], 'b' => $ref['b']));

nebo

$res = $database->table('b')->where(iterator_to_array($ref)); // tady si nejsem úplně 100 jistej

nebo

$res = $database->table('b')->where('a = ? AND b = ?', $ref['a'], $ref['b']);