Вопрос по PHP как изменить пару строк?

D
На сайте с 28.06.2008
Offline
1113
534

Придумал как ускорить запрос в несколько сотен раз, но не могу понять как правильно изменить пару строк php

Было

foreach($names as $name)
{
$sql[] = "name LIKE ".$this->_db->quote('%'.$name.'%')."";
}
}

if(!empty($sql))
{
$this->_db->setQuery("SELECT id, name, price, url, '' AS image FROM #__price WHERE (".implode(' OR ', $sql).") ORDER BY price DESC LIMIT 25");
return $this->_db->loadObjectList();
}

Этот кусок создавал запрос вида

SELECT id, name, price, url AS image FROM fq1__price WHERE (name LIKE '%Шуба%') ORDER BY price DESC LIMIT 25;

Путем тестирования и добавления полнотекстового индекса выяснил что запрос вида

SELECT id, name, price, url AS image FROM fq1__price WHERE MATCH (name) AGAINST ('Шуба') ORDER BY price DESC LIMIT 25

выполняется в разы быстрее.

Вопрос - как правильно изменить первый код чтобы получался второй запрос?

Skom
На сайте с 02.12.2006
Offline
165
#1

Надо обе части менять

В первой

$sql[] = '"'.$this->_db->quote($name).'"';

Во второй не очень понятно как и что оно там внутри setQuery подставляет (и нафига там две одинарных кавычки с запятой перед AS) , но если в лоб переписывать именно этот запрос, то

$this->_db->setQuery("SELECT id, name, price, url, '' AS image FROM #__price WHERE MATCH (name) AGAINST ('".implode(' ', $sql)."' IN BOOLEAN MODE) ORDER BY price DESC LIMIT 25");

Т.е., смысл в том, что в первой части создаётся массив экранированных поисковых слов или фраз, причём закрытых с обеих сторон двойными кавычками, на случай если в переменной $name не одно слово. Например "Шуба", "Носки дырявые".

А во второй части этот массив просто разбивается пробелами внутри AGAINST.

https://dev.mysql.com/doc/refman/5.7/en/fulltext-boolean.html

Cras amet qui numquam amavit quique amavit cras amet

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий