GROUP_CONCAT, но с ограничениями для получения более одной строки

Я разрабатываю небольшую игру с непонятными словами для пользователей на концентраторе PtokaX DC, которым я управляю. Для этого я храню список слов в таблице MySQL. Схема таблицы выглядит следующим образом:

CREATE TABLE `jumblewords` (
    `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
    `word` CHAR(15) NOT NULL,
    PRIMARY KEY (`id`),
    UNIQUE INDEX `word` (`word`)
)
COMMENT='List of words to be used for jumble game.'
COLLATE='utf8_general_ci'
ENGINE=MyISAM;

Теперь в игровом движке; Я хочу получить 20 слов в виде строки в случайном порядке. Это я могу достичь с помощью запроса, подобного этому:

SELECT GROUP_CONCAT(f.word SEPARATOR ', ' )
FROM ( SELECT j.word AS word
    FROM jumblewords j
    ORDER BY RAND()
    LIMIT 20) f

но я должен выполнять это утверждение каждый раз, когда список истекает (все 20 слов были поставлены перед пользователем).

Могу ли я изменить этот запрос, чтобы можно было выбрать более одной строки с результатами, сгенерированными из запроса, приведенного выше?

1 ответ

Решение

Вероятно, более простой способ решить эту проблему - сохранить случайные слова во временной таблице, а затем извлечь значения. Хранимая процедура была бы идеальной для этого.

DELIMITER //
DROP PROCEDURE IF EXISTS sp_jumblewords //
CREATE PROCEDURE sp_jumblewords(no_lines INT)
BEGIN

    DROP TABLE IF EXISTS tmp_jumblewords;
    CREATE TEMPORARY TABLE tmp_jumblewords (
        `word` VARCHAR(340) NOT NULL);

    REPEAT 
        INSERT INTO tmp_jumblewords 
        SELECT GROUP_CONCAT(f.word SEPARATOR ', ' )
        FROM ( SELECT j.word AS word
                FROM jumblewords j
            ORDER BY RAND()
                LIMIT 20) f;

        SET no_lines = no_lines - 1;
        UNTIL no_lines = 0
    END REPEAT;

    SELECT * FROM tmp_jumblewords;

END //
DELIMITER ;

CALL sp_jumblewords(20);
Другие вопросы по тегам