• Как найти слово сразу в трех разных таблицах в бд?

    При такой исходной постановке задачи это всегда будет три отдельных запроса. Другое дело, что их можно объединить через конструкцию sql UNION.

    Вот абстрактный пример:
    select
      display_name
      , 'Table one' as TableName
    from
      one
    where
      [display_name] = 'Искомое слово'
    union all
    select
      display_name
      , 'Table two' as TableName
    from
      two
    where
      [display_name] = 'Искомое слово'
    union all
    select
      display_name
      , 'Table three' as TableName
    from
      three
    where
      [display_name] = 'Искомое слово'

    На выходе будет таблица из двух колонок с искомым словом и названием таблицы где оно было найдено.
    Ответ написан
    Комментировать
  • Как лучше составить SQL запрос, охватывающий несколько таблиц?

    Надо не только связать, но и вычленить уникальные данные без дублирования, здесь поможет инструкция DISTINCT:
    SELECT DISTINCT
      planet.*
    FROM
      planet
    INNER JOIN
      planet_resource
    ON
      planet_resource.planet_id = planet.id
    INNER JOIN
      planet_resource_person
    ON
      planet_resource_person.resource_id = planet_resource.id
    INNER JOIN
      people_planet
    ON
      people_planet.people_id = planet_resource_person.person_id
      AND people_planet.planet_id = planet.id
    WHERE
      people_planet.people_id = ID нужного человека
    Ответ написан
  • Что за ошибку выдает Microsoft SQL Server Management Studio?

    Это означает, что Вы пытаетесь вставить в бинарное или текстовое поле данные больше максимально разрешённой длины. Посмотрите длины столбцов и вставляемых данных. Либо обрезайте данные, что бы они гарантированно могли разместиться в соответствующих полях.
    Ответ написан
    Комментировать
  • SQL запрос (UPDATE)?

    Синтаксис команды T-SQL UPDATE позволяет обновлять одну таблицу, но для фильтрации по аналогии с командой SELECT можно использовать множество таблиц.
    Т.е. В общем виде это выглядит так
    UPDATE
      ОбновляемаяТаблица
    SET
      ПолеОбновляемойТаблицы1 = Значение1
      , ПолеОбновляемойТаблицы2 = Значение2
    FROM
      ОбновляемаяТаблица
    LEFT OUTER JOIN
      ДополнительнаяТаблица
    ON
      ДополнительнаяТаблица.Ключ = ОбновляемаяТаблица.Ключ
    WHERE
      Условия фильтрации

    Для условий вашей задачи можно по этому шаблону преобразовать условия из вашего SELECT запроса в условия для UPDATE:
    UPDATE
      Account
    SET
      UsrLastActivityDate = GETDATE()
      , UsrProsrochen = 1
    FROM
      Account account -- Основная обновляемая таблица
    LEFT OUTER JOIN
     Activity activity -- дополнительная таблица с информацией о задачах
    ON
     activity.AccountId = account.Id
    WHERE 
     TypeId = '03a75490-53e6-df11-971b-001d60e938c6'
      AND DATEDIFF(dd, ModifiedOn ,GETDATE()) > 60
      AND activity.Id IS NULL -- аналогичный SELECT фильтр на отсутствие задач
    Ответ написан
    Комментировать
  • Как сделать выборку в MYSQL группируя один столбец и выбирая кол-во значений другого?

    Эту задачу можно решить в два подхода:
    1. Выясняем, для каких значений id_work выполняется условие наличия хотя бы по одному значению для type из множества (2, 4)
    2. Для найденных значений id_work выбираем полный набор данных для type из множества (2, 4)

    На практике это означает запрос использующий подзапрос для п. 1 и использование inner join дл п. 2:
    SELECT
      T.id
    FROM
      (
        SELECT
          id_work
        FROM
          T
        WHERE
          type IN (2, 4)
        GROUP BY
          id_work
        HAVING
          count(distinct type) = 2
      ) AS filteredIdWork
    INNER JOIN
      T
    ON
      T.id_work = filteredIdWork.id_work
      AND T.type IN (2, 4)
    Ответ написан
    Комментировать
  • Как написать SQL-запрос: вывод пользователей, кто отменял дважды заказ в течение получаса?

    Ответ на поверхности. Поскольку Вы знаете отправную точку и точное условие для включения пользователя в статистику, то достаточно воспользоваться конструкцией INNER JOIN для поиска пар одинаковых событий в временном промежутке, например наподобие вот этого:
    SELECT DISTINCT
      orders.user_id
    FROM
      orders
    INNER JOIN
      orders AS canceledOrders
    ON
      canceledOrders.user_id = orders.user_id
      AND canceledOrders.status = orders.status
      AND canceledOrder.order_id <> orders.order_id
      AND canceled.timestamp - orders.timestamp BETWEEN 0 AND 1800
    WHERE
      orders.status = 'cancel'
    Ответ написан
    Комментировать
  • Как составить SQL запрос из нескольких таблиц?

    На самом деле всё простое, ведь у нас есть очень важное ограничение в каждой таблице в день только по одной записи... Что это может нам дать, поскольку в каждой из таблиц есть штамп времени, то в join условие нужно для всех трёх таблиц добавить равенство даты (год, месяц, день) между собой, тогда для всего массива датчиков будет формироваться ровно по одной строке на каждый день из диапазона. Предполагая, что штамп времени во всех таблицах назван одинаково, можно составить примерный запрос:
    SELECT pot_volt.room_id rid, pot_volt.pot_id pid,
     setp_volt voltTarget, raw_volt volt, -- pot_volt
     avg_amp amp, -- pot_power
     cr, caf2, -- bath_an
     metal_height meHeight, bath_height baHeight, temperature baTemp -- pot_bath
     FROM pot_volt
     JOIN pot_power ON pot_power.pot_id=pid AND pot_power.room_id=rid AND cast(pot_volt.date_stamp as date) = cast(pot_power.date_stamp as date)
     JOIN bath_an ON bath_an.pot_id=pid AND bath_an.room_id=rid AND cast(bath_an.date_stamp as date) = cast(pot_volt.date_stamp as date)
     JOIN pot_bath ON pot_bath.pot_id=pid AND pot_bath.room_id=rid AND cast(pot_bath.date_stamp as date) = cast(pot_volt.date_stamp as date)
     WHERE rid=1 AND pid=36 AND pot_volt.date_stamp BETWEEN 1497336487 AND 1498027687
     ORDER BY pot_volt.date_stamp DESC

    Это общая идея, поскольку мне не известны форматы нужных столбцов, возможно нужно немного адаптировать.
    Ответ написан
    Комментировать
  • T-SQL. Как сделать UPDATE записей в таблице, у которых совпадает, например, GroupID, но разные TypeID?

    UPDATE UserDestination
    SET
      Number = UserSource.Number
    FROM
      Users AS UserSource
    INNER JOIN
      Users AS UserDestination
    ON
      UserSource.GroupID = UserDestination.GroupID
      AND UserSource.TypeID = 1
      AND UserDestination.TypeID = 3
    Ответ написан
    Комментировать
  • Как составить такой SQL запрос?

    Для иерархии глубиной 6 элементов (максимум) подойдёт следующий запрос:
    SELECT
      t1.*
      , count(t2.id) AS count
    FROM
      table AS t1
    INNER JOIN
      table AS t2 on t1.id = t2.parent
    INNER JOIN
      table AS t3 on t2.id = t3.parent
    INNER JOIN
      table AS t4 on t3.id = t4.parent
    INNER JOIN
      table AS t5 on t4.id = t5.parent
    INNER JOIN
      table AS t6 on t5.id = t6.parent
    WHERE
      t1.parent IS NULL
    GROUP BY
      t1.id
    HAVING
      count(t2.id) >= 3
    Ответ написан
    Комментировать
  • Разные node.tpl.php для разных типов материала?

    В своей теме необходимо иметь два файла 1) node.tpl.php и 2) node-ваш_тип_материала.tpl.php. В случае отсутствия первого файла система не регистрирует второй.
    Ответ написан
    Комментировать
  • Какой SQL запрос использовать для графика по часам?

    Если SQL сервер версии 2008 или старше, то можно сделать так:
    SELECT
        COUNT(DISTINCT [orderT].[user]) as [Orders]
        , [Hours].[Hour]
    FROM
        (
            VALUES (0), (1), (2), (3), (4), (5), (6), (7), (8), (9), (10), (11), (12), (13), (14), (15), (16), (17), (18), (19), (20), (21), (22), (23)
        ) AS [Hours]([Hour])
    
    LEFT OUTER JOIN
        [orderT]
    ON
       datepart(hh, [orderT].[date]) = [Hours].[Hour]
    WHERE
        [orderT].[Operation] LIKE 'newOrder'
        AND [orderT].[date] >= Convert(datetime, '2014-11-06 00:00:00') 
        AND [orderT].date < Convert(datetime, '2014-11-06 23:59:59')
    GROUP BY
        [Hours].[Hour]
    Ответ написан
    Комментировать