Ответы пользователя по тегу MySQL
  • Запрос периода времени в течение дня?

    @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                    -- параметрический подзапрос, все настраиваемые константы в одном месте - удобно при отладке
    Ответ написан
  • Как правильно сформировать 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.
    Ответ написан