motto13
@motto13
Вечно молодой

Как цикл который показывает количество совпавших комбинаций «перенести» в запрос MySQL?

MySQL 5.7 PDO
Структура таблицы: id, c1, c2, c3, c4, c5, c6, c7,json
с1,...c7 - (комбинации) значения 0, 1, 2,
json - это значения с1,...c7 в формате json
пример записей в таблице
id,c1,c2,c3,c4,c5,c6,c7,json
1, 1, 1, 1, 1, 1, 1, 1, [1, 1, 1, 1, 1, 1, 1]
2, 1, 1, 1, 1, 1, 1, 0, [1, 1, 1, 1, 1, 1, 0]
3, 1, 1, 1, 1, 1, 1, 2, [1, 1, 1, 1, 1, 1, 2]
4, 1, 1, 1, 1, 1, 0, 1, [1, 1, 1, 1, 1, 0, 1]
5, 1, 1, 1, 1, 1, 0, 0, [1, 1, 1, 1, 1, 0, 0]
...
Пример запроса который выбирает все записи которые гарантируют одно совпадение 7 из 7 , при вводе
следующих параметров с1=1,0,2; c2=1,0; c3=2, c4=1; c5=1; c6=1; c7=1
$database->prepare("SELECT id, json FROM test 
WHERE (c1= 1 OR c1=0 OR c1=2) AND (c2= 1 OR c2=0) AND (c3=2) AND c4=1 AND c5=1 AND c6=1 AND c7=1 ");
$database->execute();
$sql1 = $sql2 = $database->fetchAllAssociative();

далее в цикле определяю количество возможных попаданий, то есть к примеру 7 раз полностью совпали 1 раз, 6 совпало из 7 = 3раза, 5 совпало из 7 = 10 раз
$i=0;
       foreach ($sql1 as $k=>$v) {
            $v_json =  json_decode($v['json']);
           foreach ($sql2 as $k2 => $v2) {
                $i++;
                $v2_json =  json_decode($v2['json']);
                 // получить количество совпавших чисел в двух массивах
                $k_count[$i] = count(array_intersect_assoc($v_json, $v2_json));
                if ($k_count[$i] == 7) 
                    $res[7]++;
                 if ($k_count[$i] == 6) 
                    $res[6]++;
                if ($k_count[$i] == 5) 
                  $res[5]++;
            }
        }
        if($res['7']> 0) $r['7'] = $res['7']/count($count);
        else  $r['7'] = 0;

       if($res['6']> 0) $r['6'] = $res['6']/count($count);
       else   $r['6'] = 0;

        if($res['5']> 0)   $r['5'] = $res['5']/count($count);
        else  $r['5'] = 0;

Как получить такие результаты в MySQL при запросе?
  • Вопрос задан
  • 105 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы