• Выборка агрегированных значений с учетом null?

    @alexalexes
    Сможете воспроизвести Oracle выражение Rank() over (partition by ... order by ...) в MS SQL, то будет легко.
    select last_move.book_id, last_move.rack_id, last_move.board_id,  -- последнее местонахождение книги
               first_move.date_from, -- дата первого появления на складе
               last_move.date_to -- дата последнего перемещения
    from
    -- подзапрос, получаем первые записи появления каждой книги на складе
    (select *
       from (select t.*, rank() over (partition by t.book_id order by t.date_from) rnk
                  from table t)
    where rnk = 1) first_move
    
    join
    -- подзапрос, получаем последние записи перемещения каждой книги на складе
    (select *
       from (select t.*, rank() over (partition by t.book_id order by t.date_from DESC) rnk
                  from table t)
    where rnk = 1) last_move
    
    -- сопоставляем записи
    on first_move.book_id = last_move.book_id
    Ответ написан
    3 комментария
  • Что можно создать на чистом JS без знаний верстки( HTML5/CSS3)?

    @alexalexes
    JS создан как обслуживающий язык программирования для DOM-модели документа HTML.
    Его прямая обязанность манипулировать объектами документа и поддерживать обмен запросами с сервером. Для локальной машины, где он выполняется, среда ограничена, никаких вам доступа к файловой системе, процессам ОС. JS ограничен своей средой выполнения внутри браузера.
    Хотите писать на JS с полноценным окружением, то вам нужно обратиться к node.js. Но это уже backend-разработка.
    Ответ написан
    Комментировать
  • Как перевести сайт на русский язык?

    @alexalexes
    Машинный перевод будет очень топорный, если контент со специфической тематикой.
    Вообще, сейчас куча всяких программных комплексов, например, Lingvo, также можно напрячь какой-нибудь API, если нужно провернуть перевод в режиме онлайн.
    Ответ написан
    1 комментарий
  • Может ли MySQL 5.7 принимать в процедуры и INSERT-запросы VARCHAR-переменные в сыром виде (сырые строки)?

    @alexalexes
    Строка запроса при обработке SQL интерпретатором уже будет рассматриваться синтаксическим аппаратом SQL, в нем уже не отличишь, что реально имели ввиду, когда подставляли параметры.
    Предобработка такой строки регулярными выражениями, хоть может дать толк на отдельных тестовых примерах, но не убережет вас от sql-инъекций.
    Разработчик внешнего приложения должен быть сурово наказан за то, что формирует запрос вот так:
    $sql = "insert into table_name(name) value('".$str_param."')";

    А его приложение должно быть исключено из продакшена, как содержащее уязвимость, позволяющее атаковать sql-инъекциями, до того как не будет внесен фикс такого плана во всех случаях (!!!), где приложение контактирует с СУБД, а не только в этом запросе:
    $sql = "insert into table_name(name) value(:param1)";  //текст запроса с метками для вставки параметров;
    $prep_sql = $sqlconnect->prepare($sql); //подготовка SQL-запроса, фактически, синтаксический разбор и выявление меток, куда вставлять параметры, проверка ошибок;
    $prep_sql->bindParam('param1', $str_param, STRING_TYPE); //связываем параметры с метками в запросе, проверяем тип входного параметра;
    $prep_sql->execute(); //выполняем запрос

    PS: Последний пример написан на псевдокоде, но посыл должен быть понятен.
    Ответ написан
    Комментировать
  • Запрос периода времени в течение дня?

    @alexalexes
    Если вам нужно дать номер интервала для каждой записи, то вот запрос.
    Потом используйте любую группировку и аналитику для расширения запроса, как вам удобно.
    SELECT t.event_date,             -- атрибут таблицы типа datetime, для которого определяем интервал, выведен для того, чтобы наблюдать за процессом отладки
    case                                                                         -- SQL-конструкция вида "case  when ... then ... else ... end", с помощью которой можно выводить не только конкретное значение атрибута, но и задавать условие, при котором конечное значение  результата будет вычисляться по-разному в пределах одной выбранной записи.
      when TIME_TO_SEC(t.event_date) >= inter.begin AND TIME_TO_SEC(t.event_date) <= inter.end                           -- если t.event_date, выраженное в суточных секундах, находится в отрезке [inter.begin,  inter.end], также выраженных в суточных секундах,...
      then floor((TIME_TO_SEC(t.event_date) - inter.begin) / inter.width)           -- ... то вычисляем количество полных  интервалов
      else null         -- иначе, если время не попадает в период отслеживания, то выводим "пусто", чтобы явно указать, что значение не находится в интересуемом периоде
    end as full_interval_number      -- кол-во прошедших полных интервалов, начинается с 0
    FROM table t,                     -- ваша таблица
        (select TIME_TO_SEC('09:00:00') as begin,            -- начало дневного периода
                TIME_TO_SEC('18:00:00') as end,                 -- конец дневного периода
                TIME_TO_SEC('00:15:00') as width                -- ширина интервала
         ) inter                    -- параметрический подзапрос, все настраиваемые константы в одном месте - удобно при отладке
    Ответ написан
  • Возможно ли без дублирования кода реализовать сортировку по различным полям в таблице?

    @alexalexes
    Если оперировать текстом запроса, то добавьте параметр в order by.
    order by case 
                when :order_param = 1 then col_1
                when :order_param = 2 then col_2
               end,
               case 
                when :order_param = 1 then col_2
                when :order_param = 2 then col_1
               end

    Это значит, если задан, :order_param = 1, то сортировка будет эквивалентна выражению order by col_1, col_2.
    Если :order_param = 2, то order by col_2, col_1.
    Кейс можно встраивать и в подзапросы, если у вас сложное построение запроса.
    Ответ написан
    Комментировать
  • Формирование запроса?

    @alexalexes
    А почему не сразу в запросе?
    SELECT *
       from (SELECT  servers.id,
                               servers.game,
                               servers.votes,
                               @n := @n + 1 AS rank
                     FROM servers, (SELECT @n := 0) r
              ORDER BY servers.votes DESC) a 
    where id = 3
    Ответ написан
    6 комментариев
  • Как составить запрос?

    @alexalexes
    Решить это можно только в процедурном контексте программирования при постобработки результатов запроса, например, на PHP.
    /*Функция преобразования выборки в матрицу */
    function get_matrix($rows)
    {
      // получаем все значения по id - измерению матрицы (строки матрицы)
     // можно сделать запросом select distinct id from table order by id
      foreach($rows as $row)
        $id_dem[$row['id']] = 1;
    
     // получаем все значения по date - измерению матрицы (столбцы матрицы)
     // можно сделать запросом select distinct date from table order by date
      foreach($rows as $row)
        $date_dem[$row['date']] = 1;
    
    $map = null;   // если нет значений размерности матрицы, то функция вернет null
    
    // получаем карту не-null значений - непустые ячейки матрицы
      foreach($rows as $row)
        $map[$row['id']][$row['date']] = $row['count'];
    
    // дополняем карту null значениями - получаем полноценную матрицу
      if(isset($id_dem) && isset($date_dem))
        foreach($id_dem as $id => $val_id)
          foreach($date_dem as $date => $val_date)
            $map[$id][$date] = array_key_exists($id, $map) && array_key_exists($date, $map[$id])
                                 ? $map[$id][$date] : null;
       return $map;
    }
    Ответ написан
    Комментировать
  • Куда податься с знаниями PHP?

    @alexalexes
    Можно подтянуть знания клиентской части веб: CSS+HTML+JS, и сделать небольшой сайт-визитку для маленькой конторы. Владельца конторы, для которой нужна небольшая страничка в Интернете, найти через знакомых, так к тебе будут предъявлять меньше требований.
    Сможешь справится с заданием - получишь ценный опыт, не сможешь - не страшно.
    Ответ написан
    Комментировать
  • Запись звука JS с микрофона компьютера И телефона в браузере?

    @alexalexes
    Библиотеки используют для этих целей Web Audio API.
    Если только нужно два действия: записать и проиграть, то достаточно изучить вот это руководство, чтобы написать свой велосипед.
    Полной совместимости со смартфонами добиться не получится, где-то браузер - это полноценное медийное приложение, а где-то просто просмотрщик HTML, а медийный функционал доступен только через сторонние приложения, установленные непосредственно на смартфоне.
    Ответ написан
    Комментировать
  • Как правильно сформировать sql запрос при связи n:n?

    @alexalexes
    А в чем проблема?
    users - это одно множество;
    wallets - это другое множество;
    wallet_address - пересечение множеств (таблица с хордами [user_id, wallet_id]).
    Нужно просто склеить все таблицы по соответствующим ключам и вывести те записи из users, которые пересекаются с записями wallets с непустым value.
    select u.user_id, w.wallet_id, wa.value as address
      from users u
       join wallet_address wa on wa.user_id = u.user_id
       join wallets w on w.wallet_id = wa.wallet_id
    where wa.value is not null

    PS: А вы уверены, что адрес кошелька должен определяться по комбинации [user_id, wallet_id], это разве не самостоятельное свойство кошелька, то есть конкретной записи wallets?
    Если это так, то value будет относиться к wallets, а таблица wallet_address не будет иметь отношение к адресу, она просто будет хранить два внешних ключа user_id и wallet_id, чтобы выполнять исключительно функцию хранения хорд пересечений n:n.
    Ответ написан
  • Как запустить jQuery анимацию (плагин) при доскролле?

    @alexalexes
    Написал общее решение для вашей задачи, когда необходимо обработать доскроллинг.
    Запускайте плагин, когда наступает ситуация "выполнения действия", или выполняйте метод плагина, который перезапускает анимацию.

    <style>
    #div1
    {
      display: block;
      width: 400px;
      height: 1400px;
      background-color: green;
    }
    #div2
    {
      display: block;
      width: 400px;
      height: 400px;
      background-color: red;
    }
    </style>
    <div id="div1">
    </div>
    <div id="div2">
    </div>
    <script>
      //Функция для определения необходимости выполнения действия,
    //связанное с появлением элемента elem_id в видимой части документа
      function SomethingToDoElem(e, elem_id)
      {
        var elem = document.getElementById(elem_id);
        if(elem === null)
          return;
        //определение размера видимой части документа без JQuery
        var opera = (navigator.userAgent.toLowerCase().indexOf('opera') > -1),
        html = document.documentElement,
        body = document.body,
        w = document.compatMode=='CSS1Compat' && !opera ? html.clientWidth : body.clientWidth,
        h = document.compatMode=='CSS1Compat' && !opera ? html.clientHeight : body.clientHeight;
        // если величина прокрутки по вертикали + видимая высота документа
    //превышает расстояние от верха документа до элемента,
        // для которого требуется действие доскроллинга, то выполняем это действие
        if(e.currentTarget.scrollY + h > elem.offsetTop)
        {
          var is_did_something = elem.getAttribute('is_did_something'); // если действие однократного применения,
    //то получаем данные о том, что оно не выполнялось ранее, например, с помощью атрибута тега.
          if(is_did_something === null) // атрибут не создан, значит действия не было
          {
            setTimeout(function(){elem.style.backgroundColor = 'blue'; }, 1000); // выполняем действие
            elem.setAttribute('is_did_something', 1); // записываем, что действие выполнили
    // для проверки однократности его выполнения
          }
        }
      }
      // Ловим события, для которых возможно понадобиться действие доскроллинга
      
      // на загрузку документа, лучше использовать JQuery аналог
      window.onload = function(e)
      {
        SomethingToDoElem(e, "div2");
      }
      
      // на прокрутку документа
      window.onscroll = function(e)
      {
        SomethingToDoElem(e, "div2");
      }
      
    // на изменение размера окна документа, если дизайн резиновый
    // и интересуемый элемент div2 может изменять в этом случае свое положение
    // при ресайзе окна браузера.
     
    
    // !!!: лучше не привязывать через $().on('resize', ...) криво срабатывает вызов,
    // использовать только нативные способы подписки на событие.
      window.onresize = function(e)
      {
        SomethingToDoElem(e, "div2");
      }
    
    // Также нужно вызывать  SomethingToDoElem(e, "div2"); при любом динамическом изменении
    // контента страницы или блока, где этот контент расположен.
    </script>
    Ответ написан
    Комментировать
  • Можно создать мессенджер для форума?

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

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

    @alexalexes
    Там выводятся записи за последние 24 часа.

    И надпись убирается через 24 часа если изменений нет.


    У вас выборка записей свежестью в 24 часа. Они будут все новые.
    При таких условиях их не имеет смысла помечать.

    Если вам нужно понять, что появилось новое между сеансами просмотра списка (с интервалом менее 24 часа), то вам просто нужно решить задачу (с помощью cookies), как сохранить отметку времени, когда список был просмотрен, и какое действие считать за просмотр списка.
    При повторном выведении списка смотреть дату каждой записи, если запись свежее чем дата предыдущего просмотра, то это new.
    Если нет возможности получать дату записи, то придется как-то идентифицировать каждую запись и хранить флаг "просмотрено". Что не будет иметь флага "просмотрено" при повторном анализе списка, то и будет new.
    Ответ написан
    Комментировать
  • Как можна сделать так чтоб если повторяются user_id то не добавить в count?

    @alexalexes
    Пока вы не сказали, что хотите посчитать, и на какой СУБД, количество от записей по уникальным user_id будет выглядеть примерно так:
    select count(*) as cnt
    from (select user_id
                from table
         group by user_id)

    Если нужно отобразить в выборке еще какие-то нюансы, то запрос кардинально изменится.
    Ответ написан
    Комментировать
  • Не добавляется в базу данных?

    @alexalexes
    $query = 'INSERT INTO `users`(`email`, `password`) VALUES ('.$login.', '.$password.')';

    Во-первых, никогда, ни при каких обстоятельствах не склеивайте строку запроса с добавлением входных параметров, которые не прошли экранирование по sql нотации. Приклеили к строке запроса непроверенный параметр (а тем более пришедший напрямую от клиента) - считайте, что подписались на sql-инъекцию.

    Адекватная подстановка параметров происходит только при правильной подготовке запроса функциями
    mysqli_prepare() и mysqli_stmt_bind_param().

    Для получения данных из БД нужна "правильная культура" общения с ней.
    Правильная культура подразумевает:
    1. После попытки подключения нужно проверить, а состоялось ли оно.
    2. Прежде чем выполнить запрос, его текст нужно подготовить prepare-функцией.
    3. Если есть входные параметры, то привязать их к запросу bind-функцией.
    4. Запустить выполнение execute-функцией;
    5. Получить результат запроса fetch-функцией;
    6. Закрыть statement или вовсе закрыть соединение.

    В этих пунктах еще нет шагов работы с транзакциями, но если присутствует вот этот минимум, то вы уже адекватно осуществляете процесс общения с СУБД.

    В ваше случае нужно проверить, а состоялось ли подключение. Иначе нет смысла слать запросы.

    Вот пример, где более-менее верно описан процесс взаимодействия с СУБД (взят с www.php.su/mysqli_stmt_bind_param):

    <?php
    $link = mysqli_connect('localhost', 'my_user', 'my_password', 'world');
    
    /* check connection */
    if (!$link) {
        printf("Connect failed: %s\n", mysqli_connect_error());
        exit();
    }
    
    $stmt = mysqli_prepare($link, "INSERT INTO CountryLanguage VALUES (?, ?, ?, ?)");
    mysqli_stmt_bind_param($stmt, 'sssd', $code, $language, $official, $percent);
    
    $code = 'DEU';
    $language = 'Bavarian';
    $official = "F";
    $percent = 11.2;
    
    /* execute prepared statement */
    mysqi_stmt_execute($stmt);
    
    printf("%d Row inserted.\n", mysqli_stmt_affected_rows($stmt));
    
    /* close statement and connection */
    mysqli_stmt_close($stmt);
    
    /* Clean up table CountryLanguage */
    mysqli_query($link, "DELETE FROM CountryLanguage WHERE Language='Bavarian'");
    printf("%d Row deleted.\n", mysqli_affected_rows($link));
    
    /* close connection */
    mysqli_close($link);
    ?>
    Ответ написан
  • Как сделать чтобы при повторном нажатии элемент переворачивался?

    @alexalexes
    Как вариант, с помощью JS добавляете обработчик событий onmouseout и touchend, который меняет класс у элемента div с классом flipper. Попеременно, когда мышь покидает блок или касание прекращается, его состояние изменять с class="flipper right-rotate" на "flipper left-rotate" и обратно.
    Соответственно, вращения будут обозначены двумя различными правилами, под каждое состояние "триггера":
    .flip-container.hover .flipper.right-rotate {}
    .flip-container.hover .flipper.left-rotate {}

    Можно применить более изящное решение, но оно находится в компетенции технологии Sass, увы, подсказать реализацию не смогу, но уверен, что такие метаморфозы с запоминанием состояний объектов - это в порядке вещей там.
    Ответ написан
    Комментировать
  • Ширина ячейки таблицы ограничивается самым длинным словом - как убрать ограничение?

    @alexalexes
    Даже нужно использовать CSS.
    Попробуйте для ячеек таблицы вот такие свойства:
    htmlbook.ru/css/word-wrap
    htmlbook.ru/css/text-overflow

    PS: При верстке, вообще, нужно максимально использовать возможности CSS.
    Есть что-то нельзя добиться CSS стилями, то поправку стилей возможно делать через JS, но это путь к костылям.
    Ответ написан