【问题标题】:GROUP_CONCAT but with limits to get more than one rowGROUP_CONCAT 但限制获得多于一行
【发布时间】:2013-04-18 08:29:08
【问题描述】:

我正在为我管理的 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 个单词都已放在用户之前)。

我可以修改此查询,以便我可以使用上面查询生成的结果获取多行吗?

【问题讨论】:

  • 好问题!我假设,这些词需要在一行中是唯一的,但可以在各行中重复,对吧?
  • 您可以在单词完成后将限制更改为 20、40,以便从池中选择下一组单词,依此类推...
  • @ArunKillu 如果我要再次执行该语句,我不需要使用OFFSETORDER BY RAND() 会自动为我随机选择单词。

标签: mysql group-concat limits ptokax


【解决方案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);

【讨论】:

    猜你喜欢
    • 2014-06-29
    • 1970-01-01
    • 2017-01-30
    • 2017-03-31
    • 2016-12-21
    • 2023-03-29
    • 2018-04-22
    • 2012-04-28
    相关资源
    最近更新 更多