Oznámení
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)