Как создать две таблицы с первыми 75% и оставшимися 25% другой таблицы в MySQL?

#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;