#mysql #sql
#mysql #sql
Вопрос:
Я написал это, ожидая, что это сработает, но LIMIT
и OFFSET
не позволяет мне выполнять какие-либо вычисления, выдавая ошибку: «Код ошибки: 1327. Необъявленная переменная: ceil «
INSERT INTO as24t
SELECT * FROM as24 LIMIT ceil(count(*)*3/4);
INSERT INTO as24v
SELECT * FROM as24 LIMIT floor(count(*)/4) OFFSET ceil(count(*)*3/4);
Все, что я хочу сделать, это взять первые 3/4 таблицы as24 и вставить в as24t, а оставшиеся 1/4 — в as24v, учитывая, что в некоторых таблицах нечетное количество записей. Кроме того, я не хочу вычислять это и жестко кодировать числа в запросе, потому что у меня есть более 40 таблиц для разделения, и я чувствую, что должен быть умный способ.
Комментарии:
1. можете ли вы попробовать с CEIL, возможно, здесь проблема с чувствительностью к регистру, и поэтому вы получаете эту ошибку.
2. Я забыл упомянуть, что строки были упорядочены по столбцу timestamp.
Ответ №1:
Пожалуйста, найдите что-нибудь уникальное для заказа, чтобы убедиться, что вы получаете наборы дополнений.
set @numrows_25=(select count(*) from as24) * 0.25;
PREPARE STMT FROM 'INSERT INTO as24v SELECT * FROM as24 order by ... LIMIT ?';
EXECUTE STMT USING @numrows_25;
PREPARE STMT FROM 'INSERT INTO as24t SELECT * FROM as24 order by ... LIMIT 9999999999 OFFSET ?';
EXECUTE STMT USING @numrows_25;
Комментарии:
1. Спасибо за ваш ответ. Я немного изменил это, и это сработало просто отлично.
2. установите @lim1=ceil((выберите count( ) из as24) * 0.75); установите @lim2=floor((выберите count( ) из as24) * 0.25); ПОДГОТОВЬТЕ STMT ИЗ ‘INSERT INTO as24t ВЫБЕРИТЕ * ИЗ as24 LIMIT?’; ВЫПОЛНИТЕ STMT, ИСПОЛЬЗУЯ @lim1; ПОДГОТОВЬТЕ STMT ИЗ ‘INSERT INTO as24v ВЫБЕРИТЕ * ИЗ as24 LIMIT? СМЕЩЕНИЕ?’; ВЫПОЛНИТЬ STMT, ИСПОЛЬЗУЯ @lim2, @lim1;