Задать вопрос
  • Как сортировать позиции в БД по заданным весам?

    @alexalexes
    Ну, если буквально понимать задачу, и у вас нужная характеристика имеет конкретное значение, то сортировать список нужно так:
    select *
      from <таблица/соединенные таблицы для выборки товара> Tab1
    where <условия фильтрации>
    order by
    case
      when Tab1.Приоритетное_свойство = :входная_приоритетная_характеристика
      then 1 -- запись с приоритетным свойством получит повышенное очко для первичной сортировки
      else 0 -- запись с неприоритетным свойством получит пониженное очко для первичной сортировки
    end desc,
    <Другие условия сортировки (по дате добавления, имени и т.д.)>

    Если таких приоритетных характеристик несколько и они равнозначны, то можно сортировать по количеству подходящих под условие характеристик:
    select *
      from <таблица/соединенные таблицы для выборки товара> Tab1
    where <условия фильтрации>
    order by
    case
      when Tab1.Приоритетное_свойство_1 = :входная_приоритетная_характеристика_1
      then 1 -- запись с приоритетным свойством получит повышенное очко для первичной сортировки
      else 0 -- запись с неприоритетным свойством получит пониженное очко для первичной сортировки
    end
    + -- очки приоритетов складываем
    case
      when Tab1.Приоритетное_свойство_2 = :входная_приоритетная_характеристика_2
      then 1 -- запись с приоритетным свойством получит повышенное очко для первичной сортировки
      else 0 -- запись с неприоритетным свойством получит пониженное очко для первичной сортировки
    end
    + 
    -- ... и так далее все характеристики
     desc, -- 
    <Другие условия сортировки (по дате добавления, имени и т.д.)>

    Если приоритеты имеют иерархию, то через запятую в order by раскладываем case от важной характеристики, к менее важной.
    select *
      from <таблица/соединенные таблицы для выборки товара> Tab1
    where <условия фильтрации>
    order by
    case
      when Tab1.Приоритетное_свойство_1 = :входная_приоритетная_характеристика_1
      then 1 -- запись с приоритетным свойством получит повышенное очко для первичной сортировки
      else 0 -- запись с неприоритетным свойством получит пониженное очко для первичной сортировки
    end desc, -- эта более важная характеристика
    case
      when Tab1.Приоритетное_свойство_2 = :входная_приоритетная_характеристика_2
      then 1 -- запись с приоритетным свойством получит повышенное очко для первичной сортировки
      else 0 -- запись с неприоритетным свойством получит пониженное очко для первичной сортировки
    end desc, -- эта менее важная характеристика
    -- ... и так далее все характеристики
    <Другие условия сортировки (по дате добавления, имени и т.д.)>

    Можно комбинировать подходы, если есть куча характеристик на одном уровне иерархии.
    Ответ написан
    1 комментарий
  • Как подписать документ простой электронной подписью?

    @alexalexes
    Простая электронная подпись - это просто фиксация факта, что такой-то авторизованный пользователь сделал определенное действие (разместил файл, утвердил файл, сказал что "копия верна") над объектом (точные координаты размещения файла) тогда-то.

    Вам нужно любым способом создать реестр для фиксации таких действий, в которую будете записывать параметры:
    - идентификатор сессии пользователя;
    - идентификатор пользователя;
    - дата и время действия;
    - вид действия (размещение)
    - параметры объекта, над которым совершено действие (идентификатор файла или путь на диске, желательно md5 файла).
    - статус действия (осуществлено, отклонено, устарено, ошибка и т.д.)

    Для проверки подписи на файле вы пытаетесь по характеристикам файла, которые фиксируются в реестре, обнаружить актуальную запись действия (по статусу действия). Если такая запись обнаружена - значит файл подписан простой электронной подписью для данного действия.

    Также нужен бот, который будет следить за хранилищем файлов и сравнивать параметры файла с реестром, чтобы сбрасывать статусы, если файлы менялись.
    Ответ написан
    2 комментария
  • Как сделать слайдер со сменяющимся текстом внутри?

    @alexalexes
    Учить основы CSS - с чем едят свойство position.
    В данном случае для вас неожиданностью является поведение свойства position: absolute; у контейнера .header__slider-text.
    Чтобы абсолютное позиционирование было относительно слайда, дайте контейнеру слайда .header__slider-item свойство position: relative;
    Ответ написан
  • Верстка сложных кнопок адаптив?

    @alexalexes
    64997c8329d1e269390254.png
    Если без svg, то можно сделать 3-мя текстурами.
    Кнопка будет фиксированной высоты, но безразмерна по горизонтали.
    Ответ написан
    1 комментарий
  • Код из файла *.js выполняется после формирования DOM?

    @alexalexes
    Порядок парсинга скрипта зависит от того, какой атрибут укажите у тега script. По умолчанию, парсинг начинается в синхронном режиме, как только загрузится закрывающуюся скобка } у лексически значимой корневой конструкции (функция, класс и т.д.), или просто встретится вызов функции.
    Ответ написан
    Комментировать
  • Почему низкая частота процессора под нагрузкой?

    @alexalexes
    Пора обслуживать систему охлаждения - менять термоинтерфейс (если была термопаста - использовать термопасту, если были термопрокладки - термопрокладки, и т.д.). Смотреть в каком состоянии плоскость площадок радиаторов - если не в плоскость выведена (кривой охлад), то нужно применить физическую силу, чтобы это исправить.
    Ответ написан
    4 комментария
  • Почему в данных таблицы все не по порядку?

    @alexalexes
    О порядке добавления записей не нужно заботиться.
    У СУБД нет задачи хранить записи в строгом порядке, ваша задача понять, удовлетворит ли вас результат сортировки, если при выборке задать сортировку по darg-w:
    select *
      from verbs
    order by darg-w

    Если хотите получать список в порядке добавления, то логично сортировать по id:
    select *
      from verbs
    order by id

    Если хотите особую сортировку, которая не подчиняется ни id, ни естественному весу строк, то можете ввести новую колонку и следить за позиционированием строк при выборки сами, или по каким-то другим правилам вычислять позицию:
    select *
      from verbs
    order by position -- дополнительное поле, в которое будете сами или программно вбивать порядок сортировки

    Или запрос может выдергивать сам определенные строки, давая им высший приоритет (можно написать любое правило, что требует бизнес логика, или что в голову сбредет):
    select *
      from verbs
    order by case when id = 100 then 0 else 1 end -- даем записи id=100 наивысший приоритет, в любом состоянии списка она будет на 1 месте!
            , id -- остальные записи отсортируются в порядке добавления

    PS: Важно, чтобы поля, которые применяются в сортировке, были проиндексированы (в схеме СУБД были созданы индексы по данным полям и они своевременно пересчитаны).
    Ответ написан
    1 комментарий
  • Можно ли как-то получить html до определенного тега?

    @alexalexes
    1. Получить объект дерева документа d1.
    2. Создать пустой объект документа d2.
    3. Получить непосредственных детей объекта d1.
    4. Перейти к обработке очередного ребенка d1.
    4.1. Ребенок не содержит в себе признаков искомой ссылки - да, идем на шаг 4.2, нет - идем на шаг 5.
    4.2. Копируем ребенка в d2, идем на шаг 4.
    5. Прекращаем обработку детей d1, преобразуем объект d2 в текст.
    Ответ написан
    Комментировать
  • Как проверить принадлежат ли массивы из одной таблицы массивам в другой?

    @alexalexes
    С помощью функции json_to_recordset проводите нормализацию таблиц, чтобы на выходе pair получилась вот такая псевдотаблица-выборка:
    pair
    id_group, name
    1, "ананас",
    1, "апельсины",
    2, "ананас",
    2, "арбуз"
    ...
    Дальше тоже самое делаете с order_list.
    Ну, а дальше все приведено в 3-ю нормальную форму, можно, наконец, использовать SQL-ные сравнения/соединения этих псевдовыборок и высчитывать кол-ва того-сего.
    PS: Такое решение годится как разовое для получения результата, например, если вам нужно срочно сделать нестандартный отчет для руководства, а структура таблиц спроектирована из рук вон плохо.
    Нужно изначально планировать структуру базы так (приводить к 3-й нормальной форме), чтобы не прибегать к декомпозиции полей с помощью функций JSON, если компоненты внутри JSON будут использоваться для соединения между таблицами.
    Ответ написан
  • Как передавать один параметр, а не 3?

    @alexalexes
    FROM views v JOIN memes m JOIN comments c
    Вы конечно, не указали, в какой СУБД пишете, но странно видеть JOIN без ON или USING.
    Если это эквивалент синтаксиса с USING, то вы увидите статистику, если по пользователю есть И просмотры, И мемы, И комментарии. Если в одной из таблиц не будет записей, то пользователь вывалится из статистики.
    Если это эквивалент:
    FROM views v, memes m, comments c
    То такое декартово произведение таблиц с использованием distinct будет не производительно.
    Рационально вам написать такое:
    SELECT (select COUNT(v.id) from views v where v.user_id = u.user_id )      AS просмотры,
           (select COUNT(DISTINCT v.meme_id) from views v where v.user_id = u.user_id) AS [уникальные просмотры],
           (select COUNT(m.id) from memes m where m.user_id = u.user_id)      AS [выложено мемов],
           (select COUNT(c.id) from comments c where c.user_id = u.user_id)      AS [написано комментариев]
      FROM users u -- лучше связаться с таблицей users
     WHERE u.user_id = 1

    Тогда каждый подзапрос будет работать по своей агрегации (да, если по какой-то таблице не будет записей, то вы увидите по ней ноль, а не пустую строчку по всем параметрам), дистинктовать вам нужно только по параметру уникальные просмотры - но его использование не связано с размножением записей при объединении таблиц, так что он посчитает его достаточно быстро.
    PS: Если вы не забыли создать индексы для v.user_id, v.meme_id, m.user_id, c.user_id, то должно все летать на космической скорости.
    Ответ написан
  • Как копировать текст вместе с буллитами?

    @alexalexes
    Все зависит от стороны, откуда копируют в буфер обмена, и от стороны куда вставляют из буфера обмена.
    Если приложение, из которого копируют текст не засылает разметку в буфер обмена, то проблема в этом приложении.
    Если приложение, в которое вставляют текст из буфера обмена не воспринимает разметку, то проблема в нем.
    Чтобы узнать, в какой части проблема, нужно провести обмен текстом в третьем приложении, которое точно может работать с разметкой в буфере обмена, например, в офисном текстовом редакторе (не путать с простыми блокнотами), и посмотреть с каким из двух приложений не происходит обмен разметкой.
    Ответ написан
  • Как вывести id?

    @alexalexes
    1. Вычисляете агрегированную выборку - подзапрос A.
    2. Сортируете выборку в том порядке, как собираетесь нумеровать - подзарос B.
    3. Нумеруете строки доступной функцией в конкретной СУБД (в Oracle это rownum, в остальных средах есть row_number, в MySQL 5 версии нужно делать костыль из пользовательской переменной @ и if-a).
    select rownum, B.*
    from (select A.*
                from (SELECT v.user_id,
                      u.nickname,
                     COUNT(DISTINCT v.meme_id) as meme_count
                    FROM views as v
                       join  users u on u.id = v.user_id
                   GROUP BY v.user_id, u.nickname) A
            order by A.meme_count desc) B
    Ответ написан
  • Как закрыть доступ к странице, если пользователь не авторизован?

    @alexalexes
    Ну, так основное правило в вебе касаемо кейса "сделать ресурс закрытым от пользователей, у которых нет прав" - это не спрятать ссылки на этот ресурс (в вашем случае дать пользователю редирект). А не давать пользователю получать данные на самом ресурсе, куда ведут ссылки.
    То есть, вам нужно чекать авторизацию и набор необходимых прав (если есть разделение на роли, помимо наличия факта авторизации), не только для редиректа, но и на самом ресурсе, куда пользователь может попасть любым путем (на personal_product.php).
    PS:
    $select = mysqli_query($conn, "SELECT * FROM employers WHERE username='$username' AND password='$password'");

    За склейку параметров запроса в виде строки, нужно давать высшую меру наказания и вам, и автору статьи, откуда вы срисовали этот пример. Используйте, подготовленные запросы. Наказание отяжелено еще тем, что в mysqli_* функциях есть весь инструментарий, чтобы сделать запросы безопасными, и не учить никого как это делать иначе.
    Ответ написан
    1 комментарий
  • Почему лагает курсор мыши при запуске торрентов?

    @alexalexes
    Можно в роутере зафиксировать канал wifi в крайнее меньшее или большее значение, если он свободен (точки доступа соседей не мешают).
    Либо отключить в роутере диапазон частот 2,5ГГц (в этом диапазоне работают большинство радиомодулей мышей и клавиатур), оставить только 5ГГц. Если все устройства могут подключаться по 5ГГц и держать приемлемый уровень сигнала.
    Ответ написан
    Комментировать
  • Как позвонить с пк или ноутбука Windows 10 если нет Bluetooth?

    @alexalexes
    В Windows 10 есть форма "Приложения по умолчанию", где связываются приложения и расширения файлов - какие файлы каким приложением открывать.
    Если обратить внимание, то в этой форме есть переход на другую форму - "Выбор стандартных приложений для протоколов". В этой форме вас интересует протокол TEL (url:tel). Именно, то что вы установите в качестве приложения в этом протоколе будет вызываться браузером, когда будете кликать на телефонные ссылки на странице.
    Ответ написан
    1 комментарий
  • Как сделать категории в интернет магазине?

    @alexalexes
    Пишется один рекурсивный запрос одного из видов (или оба вида, чтобы два раза не вставать).
    1) Получения списка детей, если известны параметры родителя (до определенного уровня, с пропуском неважных уровней).
    2) Получения списка предков (до определенного уровня, с пропуском неважных уровней), если известны параметры ребенка.
    Выносите эти запросы в секцию with, даете им понятные псевдонимы.
    Далее ниже по тексту пишите уже привычные запросы, используя эти псевдонимы, словно это view или кеш-таблицы.

    PS: Если иерархическая выборка нужна в подзапросе, и она зависит от изменяемых в ходе выборки входных параметров ребенка/родителя, то тут нужно выносить 1 и 2 в хранимые функции, где результат функции будет табличный курсор. При использовании результата этого курсора, обычно, делают преобразование результата функции в тип "таблица" через выражения cast.
    Ответ написан
    Комментировать
  • Как работать с меню, где нет сетевых дисков?

    @alexalexes
    Можно создать на одном из дисков символическую ссылку на сетевой диск. С точки зрения такого проводника она будет восприниматься как каталог.
    Ответ написан
    Комментировать
  • Можно ли идентифицировать человека по измененному голосу?

    @alexalexes
    У речи помимо звуковых характеристик есть еще и другие.
    Скорость произношения, паузы между словами, ударения, дефекты произношения, акцент, говор.
    Если анализировать среди малой группы людей, то при детальном анализе речи, а не голоса, изменение голоса не поможет замаскироваться.
    Ответ написан
    Комментировать
  • Как сделать регулярное выражение на проверку телефона и замену первой цифры на 7?

    @alexalexes
    Любым способом посимвольного перебора строки чистите ее по такому принципу:
    1) Первый символ может быть + или цифра.
    2) Второй и последующие символы - только цифры.
    Далее, если в начало входит 8, значит заменяете на +7. И вообще, можете применить любое форматирование: где-то поставить скобки, где-то дефисы.
    Если у вас только российские номера, можете ругнуться, если что-то вначале идет не на 8 и не +7 (и не на 9, если пользователь не стал писать код, а сразу перешел к префиксу оператора, тогда автоматом нужно дописать +7).
    Ответ написан
    Комментировать
  • Как скрыть строку *?

    @alexalexes
    Припаркую свой велосипед.
    $input = 'Привет мир!';
    $input_len = mb_strlen($input);
    $output = join('', array_map(function($index, $char) use ($input_len)
                                 {
                                 	return $index > 1 && $index + 1 < $input_len ? '*' : $char;
                                 }, array_keys(mb_str_split($input)), mb_str_split($input)
                                )
                  );
    echo $output;
    Ответ написан