SQL-запрос в сниппете фильтрации ресурсов по набору tv
Доброго времени суток!
Пишу сниппет фильтрации ресурсов по набору tv-полей и столкнулся со странной отработкой запроса.
Логика и примеры результатов отработки запроса под катом.
Если подробнее, то есть некий, передаваемый сниппету, массив значений tv-полей, например:
В сниппете каждый элемент этого массива (кроме обязательного с ключом 8) в цикле добавляется в массив $where_for_clear_sql:
Затем формирую запрос:
Казалось бы всё логично: в запросе обязательно учитывается родитель в котором искать ресурсы, чтобы эти ресурсы были опубликованы, чтобы tv с id 8 у этих ресурсов был равен определённому значению. Затем идут необязательные поля. При выборе бОльшего количества необязательных полей критерии поиска должны сужаться. Но результатов не находится вовсе, хотя ресурсы с такими параметрами есть.
Например, есть 3 ресурса:
При передаче массива
При передаче массива
Но стоит добавить в массив необязательные поля
Ломаю голову уже второй день и не могу понять, почему этот запрос так не естественно отрабатывается. И, как я понимаю, при implode(' OR ', $where_for_clear_sql) сужение критериев поиска мне не дождаться, а при implode(' AND ', $where_for_clear_sql) и, например таком массиве:
Засомневался вообще в возможности написать такой запрос, чтобы выводил результаты и чем больше параметров выбрано тем точнее результаты.
Кто-то писал что-то похожее? Подскажите, пожалуйста, как выйти из такой запутанной ситуации?
Пишу сниппет фильтрации ресурсов по набору tv-полей и столкнулся со странной отработкой запроса.
Логика и примеры результатов отработки запроса под катом.
Если подробнее, то есть некий, передаваемый сниппету, массив значений tv-полей, например:
[8] => 'Значение tv_8',
[11] => 'Значение tv_11',
[13] => 'Значение tv_13',
[16] => 'Значение tv_16'
и т.д.
, где: - ключ — id tv-поля,
- значение — передаваемое сниппету значение
В сниппете каждый элемент этого массива (кроме обязательного с ключом 8) в цикле добавляется в массив $where_for_clear_sql:
$where_for_clear_sql[] = "(mstcv.tmplvarid = ".$filter." AND mstcv.value LIKE '%".$value."%')";
Затем формирую запрос:
$q = "SELECT msc.id, msc.content, mstcv.tmplvarid, mstcv.value
FROM modx_site_content as msc
INNER JOIN modx_site_tmplvar_contentvalues as mstcv ON msc.id = mstcv.contentid
WHERE (msc.parent = 87 AND msc.published = 1) AND
(mstcv.tmplvarid = 8 AND mstcv.value = ".$_POST['8'].")
".( (count($where_for_clear_sql) == 0) ? '' : "AND (".implode(' OR ', $where_for_clear_sql).") ")."
ORDER BY msc.pagetitle ASC";
Казалось бы всё логично: в запросе обязательно учитывается родитель в котором искать ресурсы, чтобы эти ресурсы были опубликованы, чтобы tv с id 8 у этих ресурсов был равен определённому значению. Затем идут необязательные поля. При выборе бОльшего количества необязательных полей критерии поиска должны сужаться. Но результатов не находится вовсе, хотя ресурсы с такими параметрами есть.
Например, есть 3 ресурса:
id ресурса | tv_8 | tv_11 | tv_13 | tv_16 | ...
================================================
156 | 1 | Текст | 0 | 1 | ...
234 | 5 | | 1 | 0 | ...
300 | 5 | проба | 0 | 0 | ...
При передаче массива
[8] => '1'
отображается ресурс с id 156При передаче массива
[8] => '5'
отображаются ресурсы с id 234 и 300.Но стоит добавить в массив необязательные поля
[8] => '5',
[11] => '',
[13] => '1',
[16] => '1'
и т.д.
как ни одного результата найдено не будет (хотя один ресурс, удовлетворяющий такому набору значений tv есть).Ломаю голову уже второй день и не могу понять, почему этот запрос так не естественно отрабатывается. И, как я понимаю, при implode(' OR ', $where_for_clear_sql) сужение критериев поиска мне не дождаться, а при implode(' AND ', $where_for_clear_sql) и, например таком массиве:
[8] => '5',
[11] => '',
[13] => '1',
[16] => '1'
и т.д.
никаких результатов сниппет не вернёт.Засомневался вообще в возможности написать такой запрос, чтобы выводил результаты и чем больше параметров выбрано тем точнее результаты.
Кто-то писал что-то похожее? Подскажите, пожалуйста, как выйти из такой запутанной ситуации?