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

    @dimoff66
    Кратко о себе: Я есть
    Для разработки можно либо сгенерировать фейковые или как их еще называют моковые данные, разрабатывать на них, если их недостаточно для полноты тестирования, то заказчик может предоставить данные базы.
    Ответ написан
  • Почему возникает ошибка "Call to a member function fetch() on boolean"?

    @dimoff66
    Кратко о себе: Я есть
    Ошибка очень красноречивая. Она означает, что вы пытаетесь вызвать метод fetch у значения типа Boolean, это означает что переменная result содержит значение типа boolean, то есть запрос вернул false

    Чтобы этой ошибки не было, нужно писать
    if ($result = $db->query('SELECT id, name, price FROM product '
                    . 'WHERE status = "1"'
                    . 'ORDER BY id DESC '                
                    . 'LIMIT ' . $count)) {
        // твой код
    } else {
        else echo($db->error);
    }
    Ответ написан
  • Как написать триггер After Delete?

    @dimoff66
    Кратко о себе: Я есть
    INSERT INTO проданные (id_tur, id_zayavka,Дата_продажи) 
    VALUES (old.id_tur,old.id_zayavka,CURRENT_DATE())
    Ответ написан
    Комментировать
  • Можно ли подставить в IN строку sql запросе?

    @dimoff66
    Кратко о себе: Я есть
    Любой поиск подстроки подойдет, например
    WHERE POSITION(id IN products.id_categories) > 0
    или лучше
    WHERE POSITION(CONCAT(',', id, ',')  IN CONCAT(',', products.id_categories, ','))  > 0


    Но не будет работать индексация, если скорость критична то лучше вторую таблицу
    Ответ написан
  • Можно ли в запросе SELECT к одной таблице так же получить информацию о существовании записи в другой таблице?

    @dimoff66
    Кратко о себе: Я есть
    select table1.*, IF(table2.id IS NULL, 0, 1) as existsInTable2  from table1 
    left join table2 on table2.id = table1.id
    where table1.id = 1
    Ответ написан
    7 комментариев
  • Уникальные записи с самой свежей датой?

    @dimoff66
    Кратко о себе: Я есть
    Делаете вложенную таблицу с группировкой по t.idshare и MAX(dateism) и соединяете с основной

    select m.idshare, m.dateism, t.text
    from (
      select t.idshare, MAX(t.dateism) from tablename as t
      group by t.idshare
    ) as m
    left join tablename as t on m.idshare = t.idshare and m.dateism = t.dateism
    Ответ написан
    2 комментария
  • Mysql: как сделать join по max и возможно ли это?

    @dimoff66
    Кратко о себе: Я есть
    Сначала сгруппируйте данные, потом соединяйте с doc2. Примерно это будет выглядеть так:

    SELECT doc1Groupped.maxId, doc1Groupped.maxVersion, doc2.id 
    FROM (
      SELECT MAX(doc1.id) as maxId, MAX(doc1.version) as maxVersion
      FROM doc1
      GROUP BY doc1.date, doc1.title
    ) as doc1Groupped
    JOIN doc2 ON doc1Groupped.maxId = doc2.id
    WHERE doc2.id is NULL OR doc2.history = ''
    Ответ написан
    4 комментария
  • Как работает WEEK()?

    @dimoff66
    Кратко о себе: Я есть
    Потому что это понедельник и с понедельника начинается первая неделя, до первого понедельника неделя нулевая.
    Ответ написан
  • Как оптимизировать SQL запрос с помощью JOIN для одинаковых вложенных SELECT?

    @dimoff66
    Кратко о себе: Я есть
    SELECT 
      product_id, 
      min_price, 
      max_price, 
      CASE WHEN ISNULL( t2.post_id) THEN 1 ELSE 82.23546 END as rate
    FROM 
      wp_wc_product_meta_lookup as t1
    LEFT JOIN wp_postmeta as t2 ON 
      t1.product_id = t2.post_id AND 
      t2.meta_key = 'convert_to_rub'  AND 
      t2.meta_value = 1
    Ответ написан
    6 комментариев
  • Как сформулировать запрос?

    @dimoff66
    Кратко о себе: Я есть
    Делаете вложенную таблицу, где подсчитываете минимумы с группировкой по первому полю и затем основную таблицу соединяете с ней

    SELECT field1, field2, field3 FROM tableName as tMain
    INNER JOIN (
      SELECT field1, MIN(field2) as field2 FROM tableName GROUP BY field1
    ) as minTotals ON tMain.field1 = minTotals.field1 AND tMain.field2 = minTotals.field2
    Ответ написан
    Комментировать
  • Как сделать запрос к 3 таблицам с условием where?

    @dimoff66
    Кратко о себе: Я есть
    select ids.id, t1.deal_id, t2.track_id, t3.waybill_id from 
    (select '9014' as id) as ids
      left join table_1 as t1 on ids.id = t1.item_id 
      left join table_2 as t2 on ids.id = t2.item_id 
      left join table_3 as t3 on ids.id = t3.item_id


    Либо если без отбора, то
    select ids.id, t1.deal_id, t2.track_id, t3.waybill_id from
    (select t1.item_id as id from table_1 union  t2.item_id from table_2 union  t3.item_id from table_3) as ids
      left join table_1 as t1 on ids.id = t1.item_id 
      left join table_2 as t2 on ids.id = t2.item_id 
      left join table_3 as t3 on ids.id = t3.item_id
    Ответ написан
    1 комментарий
  • Как вывести эффективное время работы станка по часам в MySQL?

    @dimoff66
    Кратко о себе: Я есть
    Вероятно это примерно то же, что показал выше Лентюй, но не думаю что возможно более эффективное по скорости решение

    SELECT 
      timeStart, timeEnd, ROUND(IFNULL(seconds, 0) / 3600 * 100) as percent
    FROM
    (SELECT 
      timeStart, 
      timeEnd, 
      SUM(3600 - CASE 
        WHEN UNIX_TIMESTAMP(timeStarted) - UNIX_TIMESTAMP(timeStart) < 0 THEN 0 
        ELSE UNIX_TIMESTAMP(timeStarted) - UNIX_TIMESTAMP(timeStart) END - CASE 
        WHEN UNIX_TIMESTAMP(timeEnd) - UNIX_TIMESTAMP(timeStopped) < 0 THEN 0 
        ELSE UNIX_TIMESTAMP(timeEnd) - UNIX_TIMESTAMP(timeStopped) END) as seconds
      FROM (
    	SELECT '2020-06-23 00:00:00' as timeStart, '2020-06-23 00:59:59' as timeEnd
    	UNION SELECT '2020-06-23 01:00:00', '2020-06-23 01:59:59'  
    	UNION SELECT '2020-06-23 02:00:00', '2020-06-23 02:59:59'
        UNION SELECT '2020-06-23 03:00:00', '2020-06-23 03:59:59'
        UNION SELECT '2020-06-23 04:00:00', '2020-06-23 04:59:59'
        UNION SELECT '2020-06-23 05:00:00', '2020-06-23 05:59:59'
        UNION SELECT '2020-06-23 06:00:00', '2020-06-23 06:59:59'
      // и т.д.
    ) as HoursSet
    LEFT JOIN (
       SELECT MAX(IFNULL(StartedPoints.time, '2020-06-23 00:00:00')) as timeStarted, StoppedPoints.time as timeStopped FROM `stanki` as StoppedPoints 
            LEFT JOIN stanki as StartedPoints 
              ON StoppedPoints.name = StartedPoints.name AND
                StartedPoints.value = 'ACTIVE' AND 
                StoppedPoints.time > StartedPoints.time
            WHERE StoppedPoints.name = '01' AND StoppedPoints.value IN ('STOPPED', 'UNAVAILABLE')
            GROUP BY StoppedPoints.time
      UNION ALL
      SELECT time, '2020-06-24 00:00:00'
      FROM (SELECT * FROM stanki WHERE name = '01' ORDER BY time DESC LIMIT 1) as LastRecord
      WHERE value = 'ACTIVE'  
    ) as ActiveIntervals ON ActiveIntervals.timeStopped > HoursSet.timeStart 
      AND ActiveIntervals.timeStarted <= HoursSet.timeEnd
    GROUP BY timeStart, timeEnd) as CalculatedSeconds
    Ответ написан
    Комментировать
  • Как в mysql найти запись по номеру телефона?

    @dimoff66
    Кратко о себе: Я есть
    Возможно
    LIKE %2%2%2%2%2%2%2%2%2%2%2%2%, но если записей много, то стоит сохранить номер в виде 2222222222, возможно в дополнительном поле, если формат основного нужно оставить. Тогда поиск будет быстрым, при индексации моментальным.
    Ответ написан
    Комментировать
  • Как собрать записи из разных таблиц в одной MYSQL?

    @dimoff66
    Кратко о себе: Я есть
    Смотрите в сторону триггеров, как пример

    // После добавления записи в банк
    CREATE TRIGGER `cash_movemenets` AFTER INSERT ON `cash`
    FOR EACH ROW BEGIN
       INSERT INTO movemenets Set date = NEW.date, income = NEW.sum;
    END
    
    // После добавления записи в кассу
    CREATE TRIGGER `bank_movemenets` AFTER INSERT ON `bank`
    FOR EACH ROW BEGIN
       INSERT INTO movemenets Set date = NEW.date, income = NEW.transfer;
    END


    NEW ссылается на новую запись таблиц банка и кассы
    Ответ написан
  • Можно ли собрать такой запрос?

    @dimoff66
    Кратко о себе: Я есть
    SELECT pairs.startDate, pairs.endDate, pairs.endDate - pairs.startDate + 1 as count FROM
    (SELECT t1.date as startDate, MIN(t3.date) as endDate FROM statistics as t1
       LEFT JOIN statistics t2 ON t1.date - t2.date = 1 and t2.done = 1
       LEFT JOIN statistics as t3 ON t1.date <= t3.date and t3.done = 1
         LEFT JOIN statistics as t4 ON t3.date - t4.date = -1 and t4.done = 1
    WHERE t1.done = 1 AND ISNULL(t2.date) AND ISNULL(t4.date)
    GROUP BY t1.date) as pairs
    ORDER BY pairs.startDate


    Объяснение:
    1) Находим все записи t1, у которых нет записей с предыдущим днем t2
    2) Соединяем с записями t3, у которых нет записей с последующим днем t4 и дата которых больше t1
    3) Считаем для записей из t1 минимум даты из t3
    Ответ написан
  • Как хранить характеристики товаров в БД и делать поиск по ним?

    @dimoff66
    Кратко о себе: Я есть
    Характеристики относятся к товарам? То есть у одного товара только один набор характеристик или один товар может приходить и продаваться с разными наборами характеристик, например кроссовки адидас, цвет: Белый, размер: 37 и кроссовки адидас, цвет: Синий, размер: 39. Если второй, более сложный случай, то делаем следующие таблицы

    1) Таблица Properties (id, name, valueType) - здесь просто храним список возможных свойств
    2) Таблица PropertyValues (id, propertyId, value) - здесь храним возможные варианты значений для свойств, у которых не простой тип, то есть не строка, не число, не булево, не дата
    3) CharacteristicsSet (id, productId, name) - здесь будет храниться набор свойств для конкретной позиции товара на складе, name будет составляться автоматически как строка из свойств и их значений, указанных для позиции товара
    4) CharacteristicsValues (chartacteristicSetId, propertyId, valueType, value) - здесь будут храниться значения свойств для конкретной характеристики.

    Например нам пришли партии кроссовок со свойствами цвет: белый, размер: 37й и цвет: синий, размер: 39й. (например 100 и 50 штук соответственно)

    Тогда наши таблицы будут выглядеть следующим образом:

    Properties:
    id: 1, property: 'Цвет', valueType: 'set'
    id: 2, property: 'Размер', valueType: 'number'

    PropertyValues:
    id: 1, propertyId: 1, value: 'Белый'
    id: 2, propertyId: 1, value: 'Красный'
    id: 3, propertyId: 1, value: 'Синий'

    CharacteristicsSet:
    id: 1, productId: 777, name: 'Цвет: белый, размер: 37'
    id: 2, productId: 777, name: 'Цвет: синий, размер: 39'

    CharacteristicsValues
    chartacteristicSetId: 1, propertyId: 1, valueType: set, value: 1(ссылка на белый цвет)
    chartacteristicSetId: 1, propertyId: 2, valueType: number, value: 37
    chartacteristicSetId: 2, propertyId: 1, valueType: set, value: 2(ссылка на синий цвет)
    chartacteristicSetId: 2, propertyId: 2, valueType: number, value: 39

    Ну и в таблице склада можно будет хранить записи в виде:
    productId: 777, characteristicsSetId: 1, quantity: 100
    productId: 777, characteristicsSetId: 2, quantity: 50

    Если же различный набор свойств для одного товара нам не нужен, то все то же самое, но обходимся без таблицы CharacteristicsSet: а в CharacteristicsValues ссылаемся на сам товар. Соответственно весь поиск будет проходить по одной таблице CharacteristicsValues с индексированными полями. Например чтобы найти любые товары с цветом Белый, мы делаем поиск

    select * from CharacteristicsValues where propertyId = 1 and value = 1


    ну и с соответствующим соединениям по таблицам характеристик и(или) товаров
    Ответ написан
    Комментировать
  • Как выбрать уникальные значения из Двух связанных таблиц?

    @dimoff66
    Кратко о себе: Я есть
    Дубли могут получиться только в одном случае: если в blog_category_descriptions есть более одной записи с одинаковыми category_id.

    Вы соединяете таблицы с отношением одна к многим, причём соединяете дважды, соответственно соединения по id перемножатся с соединениями по parent id. Если для id и parent id у вас по две записи в дескрипшинз, то на выходе вы получите четыре записи. Выход делать через union all. Первую таблицу соединяете по id затем union all и соединение той же таблицы по parent id.
    Ответ написан
    2 комментария
  • Как вывести вместо ID городов их названия?

    @dimoff66
    Кратко о себе: Я есть
    fetch_assoc() возвращает очередную, в вашем случае первую, строку выборки
    Поэтому переменные $sqlcitygo и $sqlcityin у вас содержат ссылку на города первого трипа. С переменной $trip они никак не связаны и поэтому выдавать верное значение не могут в принципе. Если getTrip выдает результаты запроса, вам нужно сделать соединения в том запросе и поместить имена городов в отдельные поля.
    Ответ написан
    Комментировать
  • Как реализовать частично оплаченные счета в структуре базы?

    @dimoff66
    Кратко о себе: Я есть
    Сделать таблицу оплат
    payments: id, date, invoice_id, sum
    В ней будут отражаться оплаты по счету

    Статус по счету получать либо динамически в запросе, сравнивая сумму счета с суммой оплат по нему, либо высчитывать при оплате и ставить в поле таблицы счетов. not_payed, payed_partially, payed_fully
    Ответ написан
    1 комментарий
  • Почему запрос в базу выполняется больше 15 минут?

    @dimoff66
    Кратко о себе: Я есть
    Честно говоря первый раз вижу подобный подзапрос, используемый в селект, полагаю он должен отрабатывать для каждой строки отдельно и являться причиной тормозов с ростом базы. Возможно и с индексацией полей траблы.

    (
                            SELECT SUM(total_paid_real / conversion_rate)
                            FROM ps_orders o
                            WHERE o.id_customer = a.id_customer
                              AND o.id_shop IN (1)
                              AND o.valid = 1
                        )          as total_spent,


    Попробуйте сначала перенести таблицу для этого поля в раздел FROM и потом уже соединять с таблицей a

    SELECT SQL_NO_CACHE a.`id_customer`,
                        `firstname`,
                        `lastname`,
                        `email`,
                        a.`active` AS `active`,
                        `newsletter`,
                        `optin`,
                        a.date_add,
                        gl.name    as title,
                        total_spents.total_spent
    FROM `ps_customer` a
             LEFT JOIN ps_gender_lang gl ON (a.id_gender = gl.id_gender AND gl.id_lang = 1)
             LEFT JOIN (
                            SELECT o.id_customer, SUM(total_paid_real / conversion_rate) as total_spent
                            FROM ps_orders o
                            WHERE o.id_customer IN (SELECT id_customer FROM `ps_customer` a WHERE a.deleted = 0)
                              AND o.id_shop IN (1)
                              AND o.valid = 1
                           GROUP BY o.id_customer
                        )     total_spents ON a.id_customer = total_spents.id_customer,
    WHERE 1
      AND a.`deleted` = 0
    ORDER BY `date_add` DESC
    LIMIT 0, 50


    То же самое и с другим подобным полем
    Ответ написан
    1 комментарий