Сложная фильтрация по дополнительным полям в ИС
Есть два дополнительных поля: дата события (тип Дата, id = 23) и ежегодность события (тип Флажок, id = 25). Необходимо получать все элементы ИС:
Для этого реализованы 4 фильтра:
$element = array();
$element['type'] = 1;
$element['prefix'] = 'and ( ( (';
$element['property_id'] = 23;
$element['if'] = '!=';
$element['value'] = '';
$element['sufix'] = 'and STR_TO_DATE(information_propertys_items_table.information_propertys_items_value,\'%d.%m.%Y\') >= \''.$d_start.'\'';
$element['sufix'] .= ' and STR_TO_DATE(information_propertys_items_table.information_propertys_items_value,\'%d.%m.%Y\') <= \''.$d_end.'\')';
$property['select'][] = $element;
$element = array();
$element['type'] = 1;
$element['prefix'] = 'or (';
$element['property_id'] = 25;
$element['if'] = '!=';
$element['value'] = '1';
$element['sufix'] = ') )';
$property['select'][] = $element;
$element = array();
$element['type'] = 1;
$element['prefix'] = 'or ( (';
$element['property_id'] = 23;
$element['if'] = '!=';
$element['value'] = '';
$element['sufix'] = 'and DATE_FORMAT(STR_TO_DATE(information_propertys_items_table.information_propertys_items_value,\'%d.%m.%Y\'), \'%m-%d\') >= \''.$d_start_s.'\'';
$element['sufix'] .= ' and DATE_FORMAT(STR_TO_DATE(information_propertys_items_table.information_propertys_items_value,\'%d.%m.%Y\'), \'%m-%d\') <= \''.$d_end_s.'\')';
$property['select'][] = $element;
$element = array();
$element['type'] = 1;
$element['prefix'] = 'or (';
$element['property_id'] = 25;
$element['if'] = '=';
$element['value'] = '1';
$element['sufix'] = ') ) )';
$property['select'][] = $element;
Кусок запроса, отвечающий этим фильтрам, выглядит так:
and (
(
(
information_propertys_table.information_propertys_id='23'
and information_propertys_items_table.information_propertys_items_value != ''
and STR_TO_DATE(information_propertys_items_table.information_propertys_items_value,'%d.%m.%Y') >= '2012-09-01'
and STR_TO_DATE(information_propertys_items_table.information_propertys_items_value,'%d.%m.%Y') <= '2012-09-30'
) or (
information_propertys_table.information_propertys_id='25'
and information_propertys_items_table.information_propertys_items_value != '1'
)
) or (
(
information_propertys_table.information_propertys_id='23'
and information_propertys_items_table.information_propertys_items_value != ''
and DATE_FORMAT(STR_TO_DATE(information_propertys_items_table.information_propertys_items_value,'%d.%m.%Y'), '%m-%d') >= '09-01'
and DATE_FORMAT(STR_TO_DATE(information_propertys_items_table.information_propertys_items_value,'%d.%m.%Y'), '%m-%d') <= '09-30'
) or (
information_propertys_table.information_propertys_id='25'
and information_propertys_items_table.information_propertys_items_value = '1'
)
)
)
В результате получаем все события сентября, независимо от установленного у них года и флажка ежегодности, а должны получить (по замыслу), например, все события сентября 2012 года и все ежегодные сентябрьские события.
HAVING COUNT(information_propertys_items_table.information_propertys_items_id)= 2 используется. Фильтрация только по первым двум фильтрам или только по последним двум фильтрам возвращает ожидаемые правильные ответы.
Подскажите, пожалуйста, как можно реализовать задуманную фильтрацию?
у которых дата попадает в выбранный месяц выбранного года и событие не ежегодное;
у которых дата попадает только в выбранный месяц, но событие ежегодное.
Для этого реализованы 4 фильтра:
$element = array();
$element['type'] = 1;
$element['prefix'] = 'and ( ( (';
$element['property_id'] = 23;
$element['if'] = '!=';
$element['value'] = '';
$element['sufix'] = 'and STR_TO_DATE(information_propertys_items_table.information_propertys_items_value,\'%d.%m.%Y\') >= \''.$d_start.'\'';
$element['sufix'] .= ' and STR_TO_DATE(information_propertys_items_table.information_propertys_items_value,\'%d.%m.%Y\') <= \''.$d_end.'\')';
$property['select'][] = $element;
$element = array();
$element['type'] = 1;
$element['prefix'] = 'or (';
$element['property_id'] = 25;
$element['if'] = '!=';
$element['value'] = '1';
$element['sufix'] = ') )';
$property['select'][] = $element;
$element = array();
$element['type'] = 1;
$element['prefix'] = 'or ( (';
$element['property_id'] = 23;
$element['if'] = '!=';
$element['value'] = '';
$element['sufix'] = 'and DATE_FORMAT(STR_TO_DATE(information_propertys_items_table.information_propertys_items_value,\'%d.%m.%Y\'), \'%m-%d\') >= \''.$d_start_s.'\'';
$element['sufix'] .= ' and DATE_FORMAT(STR_TO_DATE(information_propertys_items_table.information_propertys_items_value,\'%d.%m.%Y\'), \'%m-%d\') <= \''.$d_end_s.'\')';
$property['select'][] = $element;
$element = array();
$element['type'] = 1;
$element['prefix'] = 'or (';
$element['property_id'] = 25;
$element['if'] = '=';
$element['value'] = '1';
$element['sufix'] = ') ) )';
$property['select'][] = $element;
Кусок запроса, отвечающий этим фильтрам, выглядит так:
and (
(
(
information_propertys_table.information_propertys_id='23'
and information_propertys_items_table.information_propertys_items_value != ''
and STR_TO_DATE(information_propertys_items_table.information_propertys_items_value,'%d.%m.%Y') >= '2012-09-01'
and STR_TO_DATE(information_propertys_items_table.information_propertys_items_value,'%d.%m.%Y') <= '2012-09-30'
) or (
information_propertys_table.information_propertys_id='25'
and information_propertys_items_table.information_propertys_items_value != '1'
)
) or (
(
information_propertys_table.information_propertys_id='23'
and information_propertys_items_table.information_propertys_items_value != ''
and DATE_FORMAT(STR_TO_DATE(information_propertys_items_table.information_propertys_items_value,'%d.%m.%Y'), '%m-%d') >= '09-01'
and DATE_FORMAT(STR_TO_DATE(information_propertys_items_table.information_propertys_items_value,'%d.%m.%Y'), '%m-%d') <= '09-30'
) or (
information_propertys_table.information_propertys_id='25'
and information_propertys_items_table.information_propertys_items_value = '1'
)
)
)
В результате получаем все события сентября, независимо от установленного у них года и флажка ежегодности, а должны получить (по замыслу), например, все события сентября 2012 года и все ежегодные сентябрьские события.
HAVING COUNT(information_propertys_items_table.information_propertys_items_id)= 2 используется. Фильтрация только по первым двум фильтрам или только по последним двум фильтрам возвращает ожидаемые правильные ответы.
Подскажите, пожалуйста, как можно реализовать задуманную фильтрацию?
Авторизация