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个字已被用户之前放)。
我可以修改此查询,以便我可以使用从上面查询生成的结果获取多个行吗?
答
解决此问题的一种更简单的方法可能是将随机单词存储在临时表中,然后提取值。一个存储过程将是完美的。
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);
不错的问题!我假设,这些单词需要连续排列,但可以重复排列,对吗? – GregD 2013-04-27 06:49:58
您可以将限制更改为20,40一旦完成单词,以便从池中选择下一组单词等等...... – 2013-04-27 06:55:36
@GregD,是...... – hjpotter92 2013-04-27 10:11:46