Множество проверок, множество запросов

231
25 сентября 2017, 04:03

Условия: как минимум 1, как максимум 3 строки, где userid=$_SESSION['id']; наличие для этих строк в столбцах active значений 1, 2 или 3 (обязательно все три, без повторений).

Задача: узнать, имеется ли в БД для этих строк значения active = 1, 2 или 3. Если какое-либо из значений отсутствует, записать их по порядку (сортировка - значения столбца level по убыванию), затем редирект. Если все значения присутствуют, сделать новую проверку по level и если порядок строк при сортировке по lvl изменился, перезаписать значения (1, 2, 3).

Пробный код:

$check_main=$mysqli->query("SELECT `active` FROM `characters` WHERE `userid`='".$_SESSION['id']."' AND (`active`='1' OR `active`='2' OR `active`='3')"); 
// пытаемся узнать, есть ли значения 1, 2 или 3
$check_main=$check_main->fetch_assoc();
if($check_main_second==false) {
// если отсутствуют, внесение
    $select_char=$mysqli->query("SELECT `level` FROM `characters` WHERE `userid`='".$_SESSION['id']."' ORDER BY `level` DESC LIMIT 1,1");
    $select_char->fetch_assoc();
    $mysqli->query("UPDATE `characters` SET `active`='1' WHERE `userid`='".$_SESSION['id']."' AND `level`='".$select_char."'");
    $select_char=$mysqli->query("SELECT `level` FROM `characters` WHERE `userid`='".$_SESSION['id']."' ORDER BY `level` DESC LIMIT 2,2");
    $select_char->fetch_assoc();
    $mysqli->query("UPDATE `characters` SET `active`='2' WHERE `userid`='".$_SESSION['id']."' AND `level`='".$select_char."'");
    $select_char=$mysqli->query("SELECT `level` FROM `characters` WHERE `userid`='".$_SESSION['id']."' ORDER BY `level` DESC LIMIT 3,3");
    $select_char->fetch_assoc();
    $mysqli->query("UPDATE `characters` SET `active`='3' WHERE `userid`='".$_SESSION['id']."' AND `level`='".$select_char."'");
    exit(redirect("../URL"));
}

Страшный код, при котором невозможна конвертация в строку, а также отсутствует проверка при наличии значений. Много условий, как это выполнить ума не приложу.

Answer 1

наличие ... в столбцах active значений 1, 2 или 3 (обязательно все три, без повторений)

Если список возможных значений active исчерпывается этими значениями, то

HAVING COUNT(active) = 3
   AND SUM(DISTINCT active) = 6

Если нет, то второе условие усложнится до

   AND SUM(DISTINCT CASE WHEN active IN (1,2,3) THEN active END) = 6
READ ALSO
Как прописать таймер загрузки кеев?

Как прописать таймер загрузки кеев?

подскажите делаю парсерто есть беру ключи из файла, но бывает несколько тысяч ключей и очень тормозит

228
Как отправлять cookie в заголовке отдельно? C php curl

Как отправлять cookie в заголовке отдельно? C php curl

Нужно что-бы куки отправлялись таким образом А не так

317
Подскажите с рекурсией

Подскажите с рекурсией

ЗдравствуйтеНемного не могу разобраться с рекурсией, а именно как его построить

283
API стоит лимит, как избавится?

API стоит лимит, как избавится?

В API указан лимит, на вывод значений, если я ставлю лимит 999999 то просто белый экран, если не более 1000 такое происходит, ошибок никаких нетуУбираю...

269