Как сделать склонение числительных функцией mysql (mysql declension function)

UPD: Мне для разового SQL запроса потребовалось получить строки с правильным склонением числительных напрямую из базы данных mysql. Погуглив я не нашел ничего подходящего. Создавать PHP скрипт мне показалось дольше, поэтому было принято решение написать функцию.

Я совсем не рекомендую теперь везде и всегда делать склонение таким образом. В шаблонизаторе LiveStreet есть встроенный механизм declension, рекомендуется пользоваться им.

Прошу воспринимать данный код как пример создания фукции в базе данных MySQL, для тех, кому это интересно. Внимание: использование функций и хранимых процедур может сделать ваш код менее переносимым, менее масштабируемым, более медленным и увеличить нагрузку на СУБД.



delimiter //

DROP FUNCTION IF EXISTS declension;//
CREATE FUNCTION declension(
	number INT, 
	textOne VARCHAR(255) CHARACTER SET 'utf8', 
	textTwoFour VARCHAR(255) CHARACTER SET 'utf8', 
	textOverFive VARCHAR(255) CHARACTER SET 'utf8')
 RETURNS VARCHAR(255) CHARACTER SET 'utf8'
   DETERMINISTIC
    BEGIN
		DECLARE last100 INT;
		DECLARE last10 INT;
		set last100 = number % 100;
		set last10 = number % 10;

		RETURN 
		if(last100 > 4 AND last100 < 21, textOverFive, 
			if(last10 = 1, textOne, 
				if(last10 > 1 AND last10 < 5, textTwoFour, textOverFive)
			)
		);
	END
//


Может кому пригодится. Пример использования

select 
    concat(ceil(topic_rating), ' ', declension(ceil(topic_rating), 'голос', 'голоса', 'голосов'))
from topic;

3 комментария

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

Кстати, нам нужны толковые разработчики в проект. Я вам стучался в скайп но не получил ответа
avatar
когда? давайте вечером свяжемся. у меня скайп обычно закрыт.
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.