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

    @postgree
    Что вы хотите получить? строку с датами для каждой задачи? тогда:
    DELIMITER $$
    --
    -- Создать функцию "calc_date_range"
    --
    CREATE FUNCTION calc_date_range(date_start DATE, date_end DATE)
    RETURNS text CHARSET latin1
    SQL SECURITY INVOKER
    BEGIN
    DECLARE res_text text;
    DECLARE tmp_date date;
    IF(date_end < date_start) THEN
    RETURN '';
    END IF;
    SET tmp_date := date_start;
    SET res_text :='';
    WHILE(tmp_date<=date_end) DO
    SET res_text := CONCAT(res_text,',',DATE_FORMAT(tmp_date, '%m-%d-%Y'));
    SET tmp_date := DATE_ADD(tmp_date, INTERVAL 1 DAY);
    END WHILE;
    RETURN SUBSTRING(res_text,2);
    END

    Либо вы хотите получить список дней для всех задач под условие. Для этого придется заполнить табличку "календарь" (например с полями (`cdate`,`weekend`,`lolshta`))
    И получить запросом вида:
    SELECT c.cdate FROM tasks t
    INNER JOIN calendar c ON c.cdate >= DATE(t.date_from) AND c.cdate<=DATE(t.date_to)
    WHERE
    t.USER_ID = 17
    AND t.status = 4
    AND NOT c.weekend = 1
    GROUP BY c.cdate;
    Ответ написан
    Комментировать
  • Как добиться хорошей производительности в Sphinx?

    @postgree
    Могу предположить, что идет фулскан индекса, т.к. сфинкс при фильтрации по атрибутам, без поиска просмотрит весь индекс, рассчитает все значения, попадающие под условие, отсортирует, наложит лимиты и вернет результат. Т.к. после каждого запроса можно получить мета информацию. Благодаря такому механизму можно выводить пагинацию без дополнительного запроса count(*). И да, мне кажется вы не для того кейса используете инструмент. Если все же очень надо, придется с этим смириться.
    Ответ написан
    Комментировать