tiny ‘n’ smart
database layer

Odkazy: dibi | API reference

Oznámení

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

problem s nedefinovanym order by v DibiDataSource pre postgre driver

před 10 lety

edke
Člen | 198

Mam problem s DibiDataSource ak nezadam order by:

$dataSource= dibi::getConnection()->dataSource("
    select *
    from table
    ");


$rows= $dataSource->fetchAll();

Vysledne query vyzera pre postgre takto:

SELECT *
FROM (
    select *
    from table
) AS t
WHERE TRUE
ORDER BY TRUE

s cim mam v postgre 8.2 problem: CHYBA: necelocíselná konštanta v ORDER BY

Ak zmenim query na:

SELECT *
FROM (
    select *
    from table
) AS t
WHERE TRUE
ORDER BY 1

prejde to v poriadku. samozrejme ze to nie je celkom idealne riesenie, v postgre order by 1 znamena sortovanie podla 1. stlpca s asc.

před 10 lety

David Grudl
Nette Core | 6806

Lze v postgre zapsat výraz v ORDER BY jinak, aby to bylo ideální?

před 10 lety

papo
Člen | 3

David Grudl napsal(a):

Lze v postgre zapsat výraz v ORDER BY jinak, aby to bylo ideální?

Vytvorit v selecte dummy stlpec a podla neho sortovat.DibiDataSource je nejaka obdoba view?

před 10 lety

edke
Člen | 198

David Grudl wrote:

Lze v postgre zapsat výraz v ORDER BY jinak, aby to bylo ideální?

No rieseni je viac:

  • najcistejsie by bolo, keby v pripade ze vyhodnotis nulovu hodnotu, odstranis/zakomentujes order by v query. rovnako aj applylimit aplikujes az v pripade, ze mas k nemu hodnoty, mozno by stalo zato rovnako pracovat s order by.
  • riesenie s triedenim podla 1. stlpca, co v pripade ked riesis result bez sortovania ti moze byt jedno, ale zase na druhej strane je to na urok rychlosti, kedze ten order by query zbytocne spomaluje:
    order by 1
  • pridanim dummy stlpca, co moze byt tiez problem, treba osetrit, ci stlpec s takym nazvom uz v query nie je. ale samozrejme znovu sme pri tom istom, ze sa v podstate zbytocne spomaluje query, kedze sortovanie nie je potrebne:
    select *, null as dummy
    from (select * from app_uzivatel) as t
    where true
    order by dummy

před 10 lety

David Grudl
Nette Core | 6806

Je to pořešené v poslední revizi.

před 10 lety

edke
Člen | 198

David Grudl wrote:

Je to pořešené v poslední revizi.

Vdaka, odkusane a funguje to skvelo. Ked to uz tak pekne mas zrealizovane pre orderby a limit, nechce sa ti to aplikovat aj na where ? :)

před 10 lety

David Grudl
Nette Core | 6806

No mohlo… ale to už je čistě kosmetická záležitost.

před 10 lety

edke
Člen | 198

David Grudl wrote:

No mohlo… ale to už je čistě kosmetická záležitost.

No ano, tu uz to spomalenie ak je, tak je minimalne. Len kozmetika a je tam v podstate zbytocne.

Ale chcem sa spytat este na par drobnosti:

  1. je moznost aplikovat na datasource este group by a having ? Hlavne ten group by by sa zisiel, napriklad ked z datasource je potrebne generovat roletky do formularov.
  2. pri group by by sa potom rovnako zislo vybrat z celkoveho vyctu sltpcov len niektore konkretne, to sa ako pozeram API da aplikovat cez select ?
    $dataSource->select( array( 'field1', 'field2', ... );