• Как составить sql запрос?

    @alexalexes
    Самый топорный вариант - "округляем" время до интересуемого интервала (кванта времени) функцией форматированного вывода времени и считаем кол-во записей с группировкой по форматированному значению времени, потом сортируем в нужную сторону.
    Данный пример использует функцию to_char СУБД Oracle и интервал квантования - 1 минута.
    select * from
    (
      select to_char(time, 'YYYY.MM.DD HH24:MI') time_round_minute, count(distinct userId) cnt
      from log_table
      group by to_char(time, 'YYYY.MM.DD HH24:MI') 
     )
    order by cnt desc

    Если отсортировать по форматированную времени, при условии, что формат времени записан в порядке убывания величин (год, месяц, день, час, минута, секунда), то выходные данные - практически готовая гистограмма нагрузки.
    Ответ написан
    3 комментария
  • Как вытащить данные из БД с определенными признаками избегая вхождения других?

    @alexalexes
    Пересеките таблицу сессий саму на себя по идентификатору сессии, и добавьте исключающее условие not in по подключенной таблице.
    select distinct t1.session_id, t1.action
    from table t1
    join table t2 on t1.session_id = t2.session_id
    where t1.action in ('вход', 'переход на страницу 1', 'переход на страницу 2', 'целевое действие')
    and t2.action not in (перечень того, что не должно быть точно)

    Вариант 2.
    select t1.session_id, t1.action
    from table t1
    where t1.action in ('вход', 'переход на страницу 1', 'переход на страницу 2', 'целевое действие')
    and not exists(select 1 from table t2 where t1.session_id = t2.session_id and t2.action in (перечень того, что не должно быть точно))
    Ответ написан
  • Как сделать выборку из 2 таблицы булевым значением?

    @alexalexes
    Вывод логического типа колонки должна поддерживать СУБД.
    А так, на практике, гарантировано можно работать с нулл/не нулл или 0/ не 0 флагами.
    а) Использовать left join и проверять не нулл значение, какого нибудь поля присоединенной таблицы (например, b.table1id).
    SELECT distinct a.id, a.rank, a.firstname, a.name, 
    a.secondname, b.table1id
    FROM table1 as a
    left JOIN table2 as b on b.table1id = a.id and b.dateto < ?

    б) Или считать количество строк подзапросом у порисоединенной таблицы. Можно оптимизировать, отрезав по первой записи rownum = 1, тогда cnt получите 0 или 1.
    SELECT a.id, a.rank, a.firstname, a.name, 
    a.secondname, (select count(*) from table2 as b on b.table1id = a.id and b.dateto < ? and rownum = 1) cnt
    FROM table1 as a

    в) Если поддерживается логика в выводе колонки:
    SELECT a.id, a.rank, a.firstname, a.name, 
    a.secondname, exists(select 1 from table2 as b on b.table1id = a.id and b.dateto < ?) as is_exists
    FROM table1 as a
    Ответ написан
    Комментировать
  • Как исправить ошибку при добавлении строки phpmyadmin?

    @alexalexes
    Ограничения по внешним ключам прямо говорят о том, чтобы по идентификаторам player_id и категории в справочниках players и categories существовали нужные записи, но и сами идентификаторы были того же типа данных, что и первичные ключи справочников.
    Ответ написан
  • Какой самый быстрый способ итерации массива в JS?

    @alexalexes
    Если заостряться в оптимизации скорости циклов, то я js/php придерживаюсь двух правил:
    1) Если количество элементов в массиве на протяжении всего цикла не предполагает изменения, то количество элементов лучше посчитать заранее. Так мы избежим обращения к length при каждой итерации, если интерпретатор совсем туп.
    2) Если к i-му элементу идет много обращений в течении одного хода цикла, то этот элемент лучше вытащить отдельным указателем на него.
    Все остальное - экономия на спичках.
    var item_count = array.length; // считаем заранее кол-во
    for(var i = 0; i < item_count; i++)
    {
      var item = array[i]; // вытаскиваем ссылку на элемент для простоты доступа
      ...
    }
    Ответ написан
    Комментировать
  • Как сделать валидацию формы на стороне клиента в реальном времени?

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

    @alexalexes
    Фильтруете массив:
    $selected_items = array_filter($inp_array, function($item){return $item['status'] == 0;});
    Ответ написан
    Комментировать
  • Как правильно сделать SQL запрос по нескольким значениям одного поля?

    @alexalexes
    Не знаю, как это правильно называется. "Межстрочный AND по значениям столбца" реализуется пересечением одной таблицы самой себя столько раз, сколько нужно членов and для сравнения.
    В общем, в выражении exists реализована такая конструкция.
    select ext.*
    from ext
    where 
    exists (select 1 from t as t1
                             join t as t2 on t1.field_id = t2.field_id
                              where t1.field_id = ext.f1
                                  and t1.value_id = v1 
                                  and t2.value_id = v2 )
    and exists (select 1 from t as t1
                             join t as t2 on t1.field_id = t2.field_id
                              where t1.field_id = ext.f2
                                  and t1.value_id = v3 
                                  and t2.value_id = v4 )
    Ответ написан
  • Как можно выводить результаты JS не через идентификатор, а классы?

    @alexalexes
    Возьмите элементы с помощью getElementsByClassName и переберите их в цикле, вставив нужные сведения.
    var elems = document.getElementsByClassName('your_class');
    var elem_count = elems.length;
    for(var i = 0; i < elem_count; i++)
    {
       elems[i].innerHTML = 'Какие-то данные';
    }
    Ответ написан
    Комментировать
  • Как правильно сформировать запрос sql?

    @alexalexes
    Пробовал через join, но получается множество дублей задач, так как призов к одной задаче множество.

    Не проблема, после выполнения запроса, собираете вложенный объект.
    Если боитесь все строки получать, то в цикле получайте по одной строке fetch-функцией, тоже не проблема.
    select task_id, ......, prize_id, .......
    from (сложный join)

    $out = [];
    foreach($rows as $row)
    {
      $task = &$out[row['task_id']];
      $task['id'] = row['task_id'];
      $task['name'] = row['name_task'];
      .... // другие свойства задачи
      if(!array_key_exists('prizes', $task))
      {   
        $task['prizes'] = [];
      }
     if(!is_null($row['prize_id']))
      {
       $prize = &$task['prizes'][$row['prize_id']];
       $prize['id'] =  $row['prize_id'];
        ..... // другие свойства приза
        unset($prize);
      }
      unset($task);
    }
    var_dump($out);
    Ответ написан
    Комментировать
  • Как генерировать и выдавать ссылку на скачивание по хешу?

    @alexalexes
    Ведете таблицу в базе данных site_files, в которых как минимум присутствуют поля:
    file_id - идентификатор файла (первичный ключ);
    file_path - путь к файлу на сервере;
    hash - хэш файла (от содержимого или случайная последовательность символов).
    При необходимости можете хранить оригинальное имя файла, расширение, размер, дату создания и т.д.
    Во время вставки файла на сервер, записываете сведения о нем в эту таблицу.
    Делаете скрипт отдачи, доступный по адресу: site.ru/file_download или по параметру action=get_file
    site.ru/?action=get_file&hash=18972198231
    В этом скрипте определяете, что сведения о файле нужно искать по хэшу.
    По хэшу находите file_path и отдаете по нему содержимое файла клиенту.
    Ответ написан
    Комментировать
  • Как получить общее количество не прочитанных сообщений для диалога?

    @alexalexes
    У вас в итоговой выборке есть dialogId. С помощью него делаете подзапрос в select-e, чтобы получить единственное значение.
    SELECT du.*, (
        SELECT COUNT(dm."receiverRead") "unreadMessages"
        FROM dialogs_messages dm
        WHERE 
            dm."dialogId" = du."dialogId" 
            AND dm."receiverRead" = false
            AND dm."senderUserId" NOT IN ('69e56a68-edbd-4f8b-8ccd-cb8031c5c865')
            AND dm.id NOT IN (
                SELECT dmd."messageId" FROM dialogs_messages_deleted dmd
                WHERE dmd."userId" = '69e56a68-edbd-4f8b-8ccd-cb8031c5c865'
            )
        GROUP BY dm."receiverRead"
    ) 
    FROM (
        SELECT
            DISTINCT ON (du."dialogId") du."dialogId", 
            SUBSTRING(dm."message", 1, 60), 
            du."joinedDateTime",
            users."avatarUrl",
            users.username
        FROM dialogs_users du
        LEFT JOIN dialogs_messages dm ON dm."dialogId" = du."dialogId"
        LEFT JOIN users on users.id = dm."senderUserId"
        WHERE 
            du."userId" = '69e56a68-edbd-4f8b-8ccd-cb8031c5c865'
            AND dm.id NOT IN (
                SELECT dmd."messageId" FROM dialogs_messages_deleted dmd
                WHERE dmd."userId" = '69e56a68-edbd-4f8b-8ccd-cb8031c5c865'
            )
        ORDER BY du."dialogId", dm."message" DESC
    ) du
    ORDER BY du."joinedDateTime" DESC;
    Ответ написан
    3 комментария
  • Какая разница между odbc и pdo подключением к базе?

    @alexalexes
    Вас устроят краткие выдержки из вики про две эти технологии?
    ODBC, PDO.
    В частности, в статье про PDO написано различие:
    PDO не использует абстрактные слои для подключения к БД, наподобие ODBC, а использует для разных БД их «родные» драйверы, что позволяет добиться высокой производительности. В настоящее время для PDO существуют драйверы практически ко всем общеизвестным СУБД и интерфейсам. Также PDO позволяет работать одновременно с несколькими базами данных.
    Ответ написан
    Комментировать
  • Как оплачивать русскую подписку будучи резидентом другой страны?

    @alexalexes
    Можно попробовать создать виртуальную карту в одной из платежных систем страны, например, Яндекс.Деньги.
    Но вам, скорее всего, понадобится симка оператора РФ и профиль пользователя, идентифицированный в РФ.
    Ответ написан
    Комментировать
  • Parse error: syntax error, unexpected '[' in?

    @alexalexes
    какая версия php?
    Если выше 5.6, то синтаксис массива [] допустим, если ниже, то только array().
    Ответ написан
    1 комментарий
  • Как перехватить защищенный JS?

    @alexalexes
    Вам поможет среда PhantomJS.
    https://github.com/diggin/php-PhantomjsRunner
    В ней подожгете событие на нужной кнопке, подождете чуть-чуть и выцепите ссылку.
    Ответ написан
  • Множественное удаление строк в таблице?

    @alexalexes
    но может быть есть уже готовая библиотека которая позволяет с выбранных строк отправить данные на сервер для их удаления,

    Как правило, библиотеки визуализации предоставляют возможность отображать данные клиенту в определенной форме по модели данных, заключенной в окружении JS. Этим и ограничивается виджет.
    Вам нужно самим взять обработчики событий, наполнить модель данных виджета при инициализации или фиксации изменений.
    То есть, дополнительно самим выбрать, каким способом вы будете общаться с сервером в обработчиках событий: нативным XMLHttpRequest, JQuery ajax или какой-нибудь axios. В вашем случае, разработчики виджета не дают такую возможность в бесплатной версии.
    Также, вам нужно выбрать, каков будет формат сообщений для сервера.
    Безусловно, он будет обернут в json. Как будут определены полезные данные, передача кодов и сообщений об ошибках - вы сами определяете.
    Как будет устроен интерфейс запросов к функциям сервера?
    Сейчас популярна REST модель, TreeQL, GraphQL, хотя вы можете придумать свою систему параметров и команд для модификации данных.
    Как переводить запрос от клиента в запросы сервера базы данных?
    Выше упомянутые REST модель, TreeQL, GraphQL могут обеспечить роутинг по выполнению функций на стороне сервера и само выполнение функции, но, как правило, вам еще нужно будет сконструировать SQL-запрос с помощью ORM или сделать свой велосипед.
    Как видите, чтобы что-то вписать в таблицы вам нужно согласовать выбор еще некоторых компонентов стека системы. Не только выбрать один компонент, который работает на фронтенде.
    P.S. еще одна проблема заключается в том что все примеры Datatables используют на стороне сервера PHP, который я не использую да и к тому же не знаю.

    JS+PHP - типичная связка стека фронтенд+бэкенд, а так же выбранным вами компонент, рассчинан именно на массового пользователя, использующего именно эту связку. Если компонент имеет строго фронтэнд реализацию, реализация кода на бэкенде лишь пример для правильного взаимодействия с фронтендом, то вам ничего не стоит переписать логику на свой бэкенд, главное соблюсти формат сообщений между ними.
    Ответ написан
  • Вирусы в фильмах?

    @alexalexes
    Нужен ряд условий.
    1. Формат данных в контейнере видео должен позволять хранить макросы.
    2. Проигрыватель или видеокодек должны уметь читать и исполнять этот тип макросов.
    3. Среда выполнения макроса должна иметь доступ к ресурсам системы пользователя, не подразумевая изолированную "песочницу" (сравните JS и Adobe Flash по этому показателю).
    4. Проигрыватель не предупреждает пользователя, если макрос пытается получить доступ к ресурсам системы.
    5. Пользователь позволяет макросу получить доступ к ресурсам системы, если все же спрашивают об этом.

    PS: Честно говоря, не встречал видеофайлы с вшитыми макросами (кроме интерактивных менюшек), так что шаги 2-5 - маловероятны.
    Ответ написан
  • Как из столбца с пустыми и заполненными ячейками собрать столбец только с заполненными ячейками?

    @alexalexes
    На Листе1, в столбце A у вас начальные данные.
    Ставите курсор на B1, вставляете формулу.
    Нажимаете Ctrl+Shift+Enter - активируете формулу для массива.
    =ЕСЛИОШИБКА(ИНДЕКС(Лист1!A$1:A$99;НАИМЕНЬШИЙ(ЕСЛИ(Лист1!A$1:A$99<>"";СТРОКА(Лист1!A$1:A$99));СТРОКА(B1)));"")

    Протаскиваете выделенную ячейку B1 на необходимую длину по столбцу.
    Ответ написан
    3 комментария
  • Как из многомерного массива вывести не все элементы, а только, допустим, имена?

    @alexalexes
    Скорее всего $massiv - это индексный массив, и имена находятся по индексу 1 (вторые).
    foreach ($model as $massiv)
            {
                    echo  $massiv[1] . "<br>";              
            }

    Если в массиве индексы пропущены, то вам нужно переиндексровать этот массив, и тогда точно получите результат по индексу 1.
    foreach ($model as $massiv)
            {
            $massiv_new = array_values($massiv);               
        echo   $massiv_new [1] . "<br>";              
            }
    Ответ написан
    Комментировать