MySQL限制多选查询中的字符

时间:2015-07-17 23:07:59

标签: php mysql

很抱歉,如果有一个简单的答案,但我对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在后台重新尝试,直到它找到并回答适合,然后呈现它。我不希望用户收到“请再试一次”的消息。

3 个答案:

答案 0 :(得分:1)

另一种方法是让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,如果是,则返回空字符串。这是为了避免程序中的无限循环。

答案 1 :(得分:0)

您可以使用strlen()来了解包含字符串的字符数:

$query_result = "MYSQL QUERY";

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

答案 2 :(得分:0)

您可以创建连接变量的别名,例如查询中的单词,然后使用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