Я хочу получить ровно N случайных строк из таблицы mySQL.Чтобы добиться этого, я использую хранимую процедуру с временной таблицей (код ниже): <pre>
CREATE DEFINER=<code>db_one
@ %
PROCEDURE getRandomRecords
(INnt, INT, IN section INT) BEGIN DROP TEMPORARY TABLE IF EXISTS randomRecords;CREATE TEMPORARY TABLE randomRecords (q_id
INT, section_id
INT, question_name
BLOB, hint
BLOB, question_type
INT, content
BLOB, chapter_id
INT, УНИКАЛЬНЫЙ КЛЮЧ (q_id
));loop_random: LOOP IF cnt <1 THEN LEAVE loop_random;END IF;ЗАМЕНИТЕ В randomRecords SELECT r1.q_id, r1.section_id, r1.question_name, r1.hint, r1.question_type, r1.content, r1.chapter_id ОТ ВОПРОСОВ КАК r1ОТ вопросов)) КАК q_id) КАК r2 ГДЕ r1.q_id> = r2.que_id AND r1.section_id = section AND r1.question_type = '1' GROUP BY r1.chapter_id ORDER BY r1.q_id ASC LIMIT 1;IF ROW_COUNT () = 2, ЗАДАН. Cnt = cnt;ELSE SET cnt = cnt - 1;END IF;END LOOP loop_random;ВЫБРАТЬ q_id, section_id, вопрос_имя, подсказка, вопрос_тип, контент, chapter_id ОТ ОТДЕЛКИ randomRecords ORDER BY chapter_id ASC, q_id ASC;END $$
Оператор 'if else' с помощью ROW_COUNT () после запроса замены отвечает за контроль того, был ли запрос вставлен во временную таблицу или заменен.если строка заменяется, счетчик (значение cnt) сохраняет свое значение, если он вставлен - значение cnt уменьшается.
Работает так, как должно быть в базе данных, работающей с mysql engine 5.1 - временная таблица содержит ровно N строк (переменная cnt в процедуре)в наборе результатов.При работе с базой данных в MySQL 5.5.8 этот оператор «если», кажется, игнорируется - я получаю случайное количество строк, меньше, чем определенное значение N.Я подозреваю, что ROW_COUNT () не возвращает правильное значение.Есть ли альтернатива для получения надежного значения ROW_COUNT () после использования запроса REPLACE INTO?