tiny ‘n’ smart
database layer

Odkazy: dibi | API reference

Oznámení

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

Ako napisat zlozitejsi SELECT s pouzitim CONCAT, REPEAT

před 8 lety

mbskot
Člen | 42

Cafte,
neviem si rady s napisanim takehoto selectu:

SELECT id, CONCAT(REPEAT("--", level), title) AS title FROM table;

skusam to spravit nejako takto:

getComp(array(
 'id',
 'CONCAT(REPEAT("--", level), title)' => 'title'));

public static function getComp($select)
{
  return dibi::select($select)
   ->from('table');
}

//alebo

public static function getComp($select)
{
  return dibi::query('SELECT %n', $select,
    'FROM table'
  )->fetchAll();
}

ale vtedy to cele berie ako nazov stlpca.

Chcel by som Vas poprosit o nazornu ukazku ako sa da takyto prikaz zapisat vo fluente alebo v klasickom dibi::query.

Dakujem za odpovede

před 8 lety

Milo
Nette Core | 1119

Lehce to asi nejde. Nejde na 100% rozeznat, co je název identifikátoru a co SQL kód. Řešil jsem to následovně:

$args = array(
    'id',
    'title1%sql' => 'CONCAT(REPEAT("--", [level]), [title])',
    'title2%sql' => array('CONCAT(REPEAT( %s, %n ), %n)', '--', 'level', 'title'),
    'int%i'      => 123,
);

$cols = array();
foreach( $args AS $key => $value )
{
    $parts = explode('%', (string) $key, 2);
    $modif = count($parts) > 1 ? $parts[1] : 'n';
    $cols[] = $db->translate( '%' . $modif, $value, '%if', !is_int($key), 'AS %n', $parts[0], '%end' );
}

$db->test('SELECT %SQL', $cols);

před 8 lety

mbskot
Člen | 42

najs :)

otazka znie, ci nie je efektivnejsie napisat bud nejaky nativeQuery alebo ciastocne modifikovatelny query.
Ked chcem selectovat COUNT(), MAX() tiez to musim takto prevadzat? totiz v dibi som videl nejake funkcie (mozno) suvisiace s tymto, ale akosi som im neporozumel.

před 8 lety

Milo
Nette Core | 1119

mbskot napsal(a):

najs :)

Inspiroval jsem se u modifikátorů %a a %v.

otazka znie, ci nie je efektivnejsie napisat bud nejaky nativeQuery alebo ciastocne modifikovatelny query.

Nechápu, na co se ptáš.

Ked chcem selectovat COUNT(), MAX() tiez to musim takto prevadzat? totiz v dibi som videl nejake funkcie (mozno) suvisiace s tymto, ale akosi som im neporozumel.

Vím jen o funkci count() u DataSource a Fluentu. Ta ale funguje jako SELECT COUNT(*) FROM (...subquery...)