tiny ‘n’ smart
database layer

Odkazy: dibi | API reference

Oznámení

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

SELECT * CONCAT(column1,column2,column3…) LIKE %~like~', $subject)

před 9 lety

demonic
Člen | 20

Zdravím, potřeboval bych zadanou hodnotu hledat ve více sloupcích (cca 6) nějakou rozumnou cestou skrz dibi

return $this->connection->select(‚*‘)->from($this->table)
->where(‚CONCAT(subject_name,responsible_person) LIKE %~like~‘, $subject);

Toto sice funguje, ale ne zcela správně, není li některá hodnota v db zadána tak to vyhazuje nekorektní výsledky. Mám strach, že je povinnost mít vyplněna všechna pole.

Sloupce v DB mají indexy, ne fulltextové

Poradte prosím

Editoval demonic (23. 11. 2010 17:00)

před 9 lety

Milo
Nette Core | 1119

A hledáš přesný výskyt nebo vzor?

před 9 lety

paranoiq
Člen | 388

pokud bych vyřešil jen problém s NULL, tak takhle:

WHERE CONCAT(COALESCE(sloupec1, ''), COALSECE(sloupec2, '') ...) LIKE

tady se ale indexy samozřejmě nepoužijí!

pokud se mají využít indexy, musíš se dotazovat každého sloupce zvlášť:

WHERE sloupec1 LIKE ... OR sloupec2 LIKE ...

pokud ale vyhledáváš hodnotu uprostřed sloupce (LIKE '%něco%'), tak MySQL* index stejmě nepoužije. textové indexy jsou použity jen pro vyhledávání od začátku sloupce. v takovém případě je asi jednodušší použít první řešení

další možnost je udělat si z těch šesti sloupců v jiné tabulce fultextový index a plnit ho pomocí triggerů…


*a bylo by dobré napsat jakou databázi používáš

před 9 lety

demonic
Člen | 20

Děkuji za rady, používam MySQL

Vyřešil jsem to následovně:

return $this->connection->select(‚*‘)->from($this->table)
//->where(‚CONCAT(subject_name,responsible_person) LIKE %~like~‘, $subject);
->where(‚
subject_name LIKE „%‘.$subject.‚%“ ||
responsible_person LIKE „%‘.$subject.‚%“ ||
ic LIKE „%‘.$subject.‚%“ ||
dic LIKE „%‘.$subject.‚%“ ||
phone_number LIKE „%‘.$subject.‚%“ ||
website LIKE „%‘.$subject.‚%“ ||
email LIKE „%‘.$subject.‚%“‘,
‚%if‘, isset($limit), ‚LIMIT %i %end‘, $limit,
‚%if‘, isset($offset), ‚OFFSET %i %end‘, $offset
 );

potrebuji také počet výsledků kvůli paginátoru

$q = $this->connection->select(‚id‘)->from($this->table)
->where(‚
subject_name LIKE „%‘.$subject.‚%“ ||
responsible_person LIKE „%‘.$subject.‚%“ ||
ic LIKE „%‘.$subject.‚%“ ||
dic LIKE „%‘.$subject.‚%“ ||
phone_number LIKE „%‘.$subject.‚%“ ||
website LIKE „%‘.$subject.‚%“ ||
email LIKE „%‘.$subject.‚%“‘
);
return count($q);

Řeším problém týkající se čistě Nette dokázal by někdo pomoci?

public function MySearchFormSubmitted(AppForm $form)
{
if ($form[‚ok‘]->isSubmittedBy()) {
$search = $form[‚search‘]->value;
$subject = new Subjects;
$vp = $this[‚vp‘]; //zavola komponentu Vp
$paginator = $vp->paginator;
$paginator->itemsPerPage = 2;
$paginator->itemCount = $subject->CountResults($search);
$subjects = $subject->findSubjects($search, $paginator->offset, $paginator->itemsPerPage);
$this->template->search_term = $search;
$this->template->suggestions = $subjects;
if (!$this->isAjax())
$this->redirect(‚this‘);
else {
$this->invalidateControl(‚search_result‘);
$this->invalidateControl(‚search_form‘);
$form->setValues(array(), TRUE);
}
 }

public function renderDefault()
{
if ($this->isAjax()){
$this->invalidateControl(‚search_result‘);
}
 }

Je to vyhledávací formulář, který najde zadané hodnoty a hne dje zobrazí s paginátorem, problém je, že paginátor po kliknutí např na 2 stránku pouze daný div nechá zmizet a výsledky nikde, něco nefunguje správně, nebo v mé úvaze něco chybí. Dokázal by někdo poradit? Děkuji za veškeré rady

Editoval demonic (24. 11. 2010 17:41)