GROUP_CONCAT但限制获得多个行

问题描述:

我正在为我管理的PtokaX DC集线器上的用户开发一个小型混乱词游戏。为此,我将单词列表存储在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 2013-04-27 06:49:58

+1

您可以将限制更改为20,40一旦完成单词,以便从池中选择下一组单词等等...... – 2013-04-27 06:55:36

+0

@GregD,是...... – hjpotter92 2013-04-27 10:11:46

解决此问题的一种更简单的方法可能是将随机单词存储在临时表中,然后提取值。一个存储过程将是完美的。

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