2013-04-18 4 views
2

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

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 слов были поставленным перед пользователем).

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

+0

Хороший вопрос! Я предполагаю, что слова должны быть уникальными в строке, но могут повторяться через строки, правильно? – GregD

+1

вы можете изменить предел до 20, 40, как только слова будут закончены, чтобы следующий набор слов был выбран из пула и так далее ... –

+0

@GregD, Да .... – hjpotter92

ответ

0

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

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); 
Смежные вопросы