MySQL случайный с конкретными параметрами - PullRequest
0 голосов
/ 13 мая 2018

Мне нужно было получить 20 случайных строк из базы данных.Я получил этот запрос:

SELECT * FROM `table_name` WHERE 1 ORDER BY rand() LIMIT 20

Все отлично работает, но есть проблема 1.

  • Если в базе данных менее 20 строк, например 13, то какдублировать еще 7 случайных строк, пока в ответе не будет ровно 20 строк?

PS Не беспокойтесь о пустоте.Таблица никогда не бывает пустой.

Ответы [ 2 ]

0 голосов
/ 14 мая 2018

Этого можно добиться с помощью хранимой процедуры. Этот выбирает случайные строки во временную таблицу, пока не будет вставлено нужное количество строк. Если в исходной таблице достаточно строк, во временную таблицу вставляется только одна вставка из случайных строк, достаточных для удовлетворения запроса. Если нет, все содержимое таблицы вставляется во временную таблицу достаточно раз, чтобы заполнить ее. Например, при выборе 20 случайных записей из таблицы, содержащей только 8 строк, он вставит все 8 строк таблицы (в случайном порядке) во временную таблицу, затем снова все 8 строк (в другом случайном порядке) и затем, наконец, 4 случайных ряда. Затем возвращается все содержимое временной таблицы.

DELIMITER //
DROP PROCEDURE IF EXISTS select_random //
CREATE PROCEDURE select_random (IN tablename VARCHAR(256), IN numrows INT)
BEGIN
  DECLARE rowcnt INT DEFAULT numrows;
  SET @q = CONCAT('CREATE TEMPORARY TABLE random LIKE ', tablename);
  PREPARE stmt FROM @q;
  EXECUTE stmt;
  SET @q = CONCAT('SELECT COUNT(*) INTO @totrows FROM ', tablename);
  PREPARE stmt FROM @q;
  EXECUTE stmt;
  REPEAT
    SET @q = CONCAT('INSERT INTO random SELECT * FROM ', tablename, ' ORDER BY RAND() LIMIT ', LEAST(@totrows, rowcnt));
    PREPARE stmt FROM @q;
    EXECUTE stmt;
    SET rowcnt = rowcnt - @totrows;
  UNTIL rowcnt <= 0
  END REPEAT;
  SELECT * FROM random;
  DROP TABLE random;
END
//
CALL select_random('table_name', 20);
0 голосов
/ 13 мая 2018

Как насчет того, чтобы попробовать:

SELECT * FROM 'tablename' WHERE 1 ORDER BY rand() LIMIT 1

и сделать это 20 раз.Возможно, вы захотите сохранить результаты в новой таблице, возможно, используя Select Into или / и Insert Into.

...