SQL вложен, если внутри функции с существует и проверяется отметка времени - PullRequest
0 голосов
/ 09 февраля 2019

Мне нужно проверить, что VIP существует в БД и его время не истекло.Все было бы хорошо, если бы не эта проблема: как создать булеву функцию, которая будет хранить эту функциональность?

CREATE DEFINER=`root`@`localhost` FUNCTION `IsVip`(steamId VARCHAR(17)) RETURNS tinyint(1)
BEGIN
RETURN EXISTS (SELECT SteamId, Expired FROM Vips WHERE SteamId=steamId AND Expired >= NOW());
END

Это мое решение, но эффективен ли этот код - я имею в виду оператор SELECT?

CREATE DEFINER=`root`@`localhost` FUNCTION `IsVip`(steamId VARCHAR(17)) RETURNS tinyint(1)
BEGIN
IF (SELECT VipId FROM Vips WHERE SteamId = steamId AND Expired >= NOW())
    THEN
        RETURN TRUE;
    ELSE
        RETURN FALSE;
END IF;
END

1 Ответ

0 голосов
/ 09 февраля 2019

Предполагая, что в таблице Vips имеется только одна строка на SteamID, я бы просто сделал:

SELECT 1 FROM Vips WHERE SteamId = ? AND Expired >= NOW();

Это вернет одну строку со значением 1, когдапользователь действителен (то есть существует и не имеет срока действия), и пустой набор записей, если это не так.

Другой вариант:

SELECT COUNT(*) FROM Vips WHERE SteamId = ? AND Expired >= NOW()

Всегда будет возвращать набор результатов, при этом одна запись содержитлибо 1, если пользователь действителен, либо 0, если нет.

...