$strFindInSet = 'FIND_IN_SET';
$iteration = 0;
foreach ($userRow["cur_hars"] as $key => $curHar) {
if ($iteration == 0) {
$strFindInSet = $strFindInSet . '(' . $curHar["value"] . ',`' . $curHar["id"] . '`' . ')';
} else {
$strFindInSet = $strFindInSet . ' AND FIND_IN_SET(' . $curHar["value"] . ',`' . $curHar["id"] . '`' . ')';
}
$iteration++;
}
$ifress = $db->rawQuery('SELECT * from alice5_ifress where ' . $strFindInSet . '');
Формирую запрос в цикле с FIND_IN_SET в котором устанавливаю необходимые характеристики для поиска, проблема в том что мне нужно проверять значение $curHar["id"] текущей итерации со значением $curHar["id"] предыдущей итерации и если условие выполняется, то я пишу не AND, а OR и оборачиваю в скобки FIND_IN_SET предыдущей итерации и FIND_IN_SET текущей итерации, как такое вообще выполнить???
Т.е. получается что-то вроде:
SELECT * from alice5_ifress where FIND_IN_SET (55,`10`) AND FIND_IN_SET(76,`42`) AND FIND_IN_SET(80,`59`) AND ( FIND_IN_SET(53,`8`) OR FIND_IN_SET(83,`8`))
Такое решается в 2 прохода. На первом идет группировка по id, а на втором уже формируем запрос
$clauses = [];
foreach ($array as $current) {
$clauses[$current["id"]][] = 'FIND_IN_SET((' . $curHar["value"] . ',`' . $curHar["id"] . '`' . ')';
}
$where = '';
foreach($clauses as $clause) {
if ($where) {
$where .= " AND ";
}
if (count($clause) > 0) {
$where .= '(' . implode(' OR ', $clause) . ')';
} else {
$where .= $clause[0];
}
}
UPD: исправил ответ после замечания
Сборка персонального компьютера от Artline: умный выбор для современных пользователей