tiny ‘n’ smart
database layer

Odkazy: dibi | API reference

Oznámení

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

DISTINCT v DibiDataSource

před 10 lety

romansklenar
Člen | 657

Šla by do DibiDataSource doplnit podpora pro klíčové slovo DISTINCT?

$dataSource->select('DISTINCT column'); // SELECT `DISTINCT column` ...

Zrada je v tom, že při exportu datasourcu do řetězce s dotazem se obalí zpětnými uvozovkami vždy celý řetězec (díky modifikátoru %n) a nejde dibi nijak vnutit, aby bral DISTINCT jako klíčové slovo.

Netroufám si hádat, jaká by byla nejefektivnější implementace, dost možná by jen stačilo naučit modifikátor %n naučit reagovat na určitá klíčová slova nebo brát v potaz modifikátor %sql, pak by se ale úprava netýkala DibiDataSource ale DibiTranslator-u.

Editoval romansklenar (7. 6. 2009 19:21)

před 10 lety

David Grudl
Nette Core | 6806

Ono slovo DISTINCT přímo nepatří do výčtu sloupců, takže to je dobře, že to %n nerespektuje. Otázka je, jak podporu implementovat, do nečeho tak obecného jako je datasource…

před 10 lety

phx
Člen | 652

Obcase jsem i narazil prtz jsem potreboval neco takovehoto

$ds->select('MAX(sloupecek) AS max');
// nebo by to slo mozna...
$ds->select('MAX(sloupecek)')->AS('max');

Coz taky to vezme jakou nazev sloupecku.

Osobne bych preferoval aby select u DS bralo dibi modifikatory. V podstate DibiFluent:) Aby slo psat neco jako

$ds->select('%sql', 'DISTINCT');

Vychozi by bylo ono %n a melo by to byt OK:)

Coz by nakonec i umoznilo zapisy:

$ds->select('sloupecA', 'sloupecB', 'sloupecC');
// nebo se pletu a toto jde?

před 10 lety

romansklenar
Člen | 657

Druhý parametr je teď vyhrazený pro aliasy a nesmíš zapomenout, že to musí brát i pole, aby to bylo konzistentní s where() a orderBy().

David Grudl napsal(a):

Otázka je, jak podporu implementovat, do nečeho tak obecného jako je datasource…

Pokud bychom se bavili o implementaci, je požadavek aby to bralo jen DISTINCT nebo i třeba MAX(), MIN() atd?
Já chápu datasource jako nástroj pro výběr záznamů než na provádění agregačních funkcí jako MIN/MAX/..., protože na ty se hodí určitě více DibiFluent.

před 10 lety

David Grudl
Nette Core | 6806

Jj, DibiDataSource má být odlišné od DibiFluent a mělo by být limitované jen na výběr z dat.

DISTINCT by měl umět. Jen mám pocit, že funkce se na různých databázích liší, na MSSQL tuším DISTINCTROW = DISTINCT na MySQL.