Php MySQL限制多选查询中的字符数

Php MySQL限制多选查询中的字符数,php,mysql,Php,Mysql,很抱歉,如果有一个简单的答案,但我对MySQL相当陌生,不知道如何解释这个问题: 我有许多查询选择随机词并将它们连接在一起。我试图将查询限制为仅返回低于特定字符限制的结果。例如,这里有一个查询: SELECT CONCAT((SELECT Word FROM Adjectives ORDER BY Rand() LIMIT 1),' ', (SELECT Word2 FROM Verbs ORDER BY Rand() LIMIT 1),' ',

很抱歉,如果有一个简单的答案,但我对MySQL相当陌生,不知道如何解释这个问题:

我有许多查询选择随机词并将它们连接在一起。我试图将查询限制为仅返回低于特定字符限制的结果。例如,这里有一个查询:

SELECT CONCAT((SELECT Word FROM Adjectives ORDER BY Rand() LIMIT 1),' ',
              (SELECT Word2 FROM Verbs ORDER BY Rand() LIMIT 1),' ',
              (SELECT Word FROM Nouns ORDER BY Rand() LIMIT 1))
它返回的结果类似于形容词-动词-名词

我想做的是让查询检查完整的连接结果是否为30个字符或更少;如果是,则返回它,如果不是,请重试,直到出现一个包含30个或更少字符的字符。谢谢


更新:这是一个幻想足球队名称生成器,它从不同的表中提取随机单词并将它们串在一起。因此,实际上有数百万种可能的组合。。。。如果用户指定了字符限制,我希望SQL在后台重新尝试,直到找到合适的答案,然后显示出来。我不希望用户收到“请重试”之类的消息

您可以使用strlen了解该字符串包含多少个字符:

$query_result = "MYSQL QUERY";

if(strlen($query_result) <= 30){
    echo $query_result;
}

您可以创建连接变量的别名,例如查询中的单词,然后使用php进行检查

$query = "SELECT CONCAT((SELECT Word FROM Adjectives ORDER BY Rand() LIMIT 1),' ',
              (SELECT Word2 FROM Verbs ORDER BY Rand() LIMIT 1),' ',
              (SELECT Word FROM Nouns ORDER BY Rand() LIMIT 1)) as words"

$row = $query->fetch_assoc();
$words = $row['words'];
然后你可以用类似strlen的东西来检查长度

if (strlen($words)) > 30 {
 echo 'too many words';
然后再把表格吐出来。您可以将其嵌入此处,这样您将获得错误,然后再次获取表单,或者您可以只使用如下显示指示器:

     $display_form = 1;
}

else {
   echo $words;
  $display_form= 0;
}
SELECT words from
(SELECT CONCAT((SELECT Word FROM Adjectives ORDER BY Rand() limit 1 ),' ',
              (SELECT Word2 FROM Verbs ORDER BY Rand() limit 1),' ',
              (SELECT Word FROM Nouns ORDER BY Rand() limit)) as words) as temptable
where length(words) < 30
===

编辑-新澄清的备选答案

你可以这样做:

     $display_form = 1;
}

else {
   echo $words;
  $display_form= 0;
}
SELECT words from
(SELECT CONCAT((SELECT Word FROM Adjectives ORDER BY Rand() limit 1 ),' ',
              (SELECT Word2 FROM Verbs ORDER BY Rand() limit 1),' ',
              (SELECT Word FROM Nouns ORDER BY Rand() limit)) as words) as temptable
where length(words) < 30

另一种方法是让SQL来处理决策,最后吐出您想要的字符串。我在这里使用了一个SQL过程

DELIMITER $$
CREATE OR REPLACE PROCEDURE `FETCH_STRING`(IN LEN INT)
    BEGIN

        declare TEMP varchar(100);
        declare isValid boolean;
        declare maxLength int;
        declare minLength int;

        set maxLength = LEN;
        set isValid = false;

        set minLength = (SELECT MIN(LENGTH(n.word))+MIN(LENGTH(a.word))+MIN(LENGTH(v.word))+2 FROM NOUNS n, ADJECTIVES a, VERBS v);
        #That +2 in the end is compensating for two spaces in between
        if maxLength < minLength THEN
            set temp = "";
            set isValid = true;
        END IF; 

        WHILE isValid = false DO
            set temp = (SELECT CONCAT(
                    (SELECT Word FROM Adjectives ORDER BY Rand() LIMIT 1) ,' ',
                    (SELECT Word FROM Verbs ORDER BY Rand() LIMIT 1),' ',
                    (SELECT Word FROM Nouns ORDER BY Rand() LIMIT 1)));
            IF LENGTH(temp) <= maxLength THEN
                set isValid = true;
            END IF;
        END WHILE;            
    select temp;
    END$$
DELIMITER ; 
这应该可以做到。您可以调用它,并始终获得与您的需求匹配的字符串。无需再次处理

这就是你要找的吗

编辑:
添加了所需长度的输入字段。并添加了检查给定长度是否大于可能的最小concat的条件,如果是,则返回一个空字符串。这是为了避免过程中出现无限循环。

我认为您选择的bla bla正是我想要定义的。。。。如果超过字符限制,如何使其重新运行查询?我希望这对最终用户是透明的,用户只能看到最终结果。对不起,我不理解你的问题。只需消除一个错误,然后再次显示表单。看见edit@KielLamar我在想这个,现在我意识到我更困惑了。如果您正在测试用户输入,为什么要进行数据库查询?如果超过这个数量,它还不会在数据库中吗?你是在测试一个输入表单,还是人们从已经存在的一组单词中选择句子?嗨,nomistic,我也会更新OP。。。。这是一个梦幻足球队名称生成器。因此,用户单击generate并生成一个新的随机名称,从名词中提取一个随机词,从形容词中提取一个随机词,等等,还有许多其他组合。如果他们指定了字符限制,我不希望他们收到重试消息;我宁愿SQL重新尝试,直到它找到合适的结果并显示出来。再次修复它,我相信我在没有测试它之前犯了一个错误I像这种方法,但我得到以下错误:1064-您的SQL语法有错误;请查看与您的MariaDB服务器版本对应的手册,以了解第4行附近要使用的正确语法。设置最小长度线中的不平衡偏析。修好了哎呀。。我又开始写论文了。我的错。。!!固定的“现在应该行了。”诺米斯蒂克:我最初也这么认为。但是,就DB调用和执行时间而言,这是一个有效的解决方案。我的考虑是避免在随机选择不符合所需大小时调用多个DB。我认为这是一个保证多个数据库调用的简单场景。因此,我们既不必检查返回的字符串是否符合要求的长度,也不必再次调用数据库。@SarathChandra我真的希望它能工作。。。。但同样的错误一直在显示。不过,你所有的括号等等,似乎都是对的。