Функция Mysql, используемая в VIEW, не возвращает правильный результат. - PullRequest
0 голосов
/ 30 ноября 2018

У меня странная проблема (я пытался найти предыдущие ответы, но ничего не смог найти).Я создал эту функцию:

CREATE DEFINER=`root`@`localhost` FUNCTION `CALCULATEDATE`(caller VARCHAR(4)) RETURNS date
BEGIN
DECLARE cur_day INT(2);
DECLARE cur_time INT(2);
DECLARE calculated_date DATE;

IF caller = 'HOME' THEN
    SELECT DAY(CONVERT_TZ(NOW(),@@system_time_zone,'US/Pacific')) INTO cur_day; 
    SELECT HOUR(CONVERT_TZ(NOW(),@@system_time_zone,'US/Pacific')) INTO cur_time; 
    /*Case homepage */
    IF cur_day = DAY(NOW()) THEN
        IF cur_time < 7 THEN
            /*return yesterdays date */
            SET calculated_date = DATE_SUB(CURDATE(), INTERVAL 1 DAY);
        ELSE
            /*return todays date */
            SET calculated_date = CURDATE();
        END IF;
    ELSE
        SET calculated_date = DATE(CONVERT_TZ(NOW(),@@system_time_zone,'US/Pacific'));
    END IF;
ELSE
    /*Case newsletter */

    /*return todays date */
    SET calculated_date = CURDATE();
END IF;

RETURN calculated_date;
END

, которая возвращает дату (на основе сравнения времени PST).

Я вызываю эту функцию из вида:

CREATE 
    ALGORITHM = UNDEFINED 
    DEFINER = `root`@`localhost` 
    SQL SECURITY DEFINER
VIEW `dd_vwfeatured` AS
    (SELECT 
        `doms`.`id` AS `id`,
        `doms`.`name` AS `name`

    FROM
        `myelements` `doms`
    WHERE
        `doms`.`id` IN (SELECT 
                `d`.`domainid`
            FROM
                (`daily_featured_picks` `d`
                LEFT JOIN `daily_featured` `f` ON ((`d`.`featuredid` = `f`.`id`)))
            WHERE
                (`f`.`date` = CALCULATEDATE('NEWS')))
    ORDER BY `doms`.`name`)

Функция прекрасно работает, если вызывается из запроса MySQL, но в представлении я всегда получаю все записи взамен.

Можете ли вы, ребята, помочь?

Спасибо, DT

1 Ответ

0 голосов
/ 30 ноября 2018

Я наконец-то решил это (не уверен, почему это не надето на вид).Я изменил подход и использовал хранимую процедуру.

CREATE DEFINER=`root`@`localhost` PROCEDURE `new_procedure`(IN p VARCHAR(4))
BEGIN
DECLARE p_tipo  DATE;

SELECT CALCULATEDATE(p) 
    INTO p_tipo;

SELECT 
        `doms`.`id` AS `id`,
        `doms`.`name` AS `name`,
        `doms`.`description` AS `description`,
        `doms`.`price` AS `price`
    FROM
        `myelements` `doms`
    WHERE
        `doms`.`id` IN (SELECT 
                `d`.`domainid`
            FROM
                (`daily_featured_picks` `d`
                LEFT JOIN `daily_featured` `f` ON ((`d`.`featuredid` = `f`.`id`)))
            WHERE
                (`f`.`date` = p_tipo))
    ORDER BY `doms`.`name`;

END
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...