如何检查Mysql数据库中是否存在精确的slug(单次出现或多次出现)?

如何检查Mysql数据库中是否存在精确的slug(单次出现或多次出现)?,mysql,Mysql,我正在创造新的鼻涕虫。假设我的slug变量是$slug='About Us' 我有一张桌子,里面有一个叫做slug的字段。slug column的值可以如下所示:- “关于我们” “关于-Us-2” “关于-Us-3” “关于我们5” 如果是重复的slug,我们将在最后一个破折号后追加一个数值 “关于-Us-2” “关于-Us-3” “关于我们5” 在插入新数据时,我们需要检查一个段塞是否以精确的形式出现,或者最后一个“-”破折号后面的部分是数字部分 我想通过使用这个查询来检查这一点 "SELE

我正在创造新的鼻涕虫。假设我的slug变量是
$slug='About Us'

我有一张桌子,里面有一个叫做slug的字段。slug column的值可以如下所示:-

  • “关于我们”
  • “关于-Us-2”
  • “关于-Us-3”
  • “关于我们5”
  • 如果是重复的slug,我们将在最后一个破折号后追加一个数值

  • “关于-Us-2”
  • “关于-Us-3”
  • “关于我们5”
  • 在插入新数据时,我们需要检查一个段塞是否以精确的形式出现,或者最后一个“-”破折号后面的部分是数字部分

    我想通过使用这个查询来检查这一点

    "SELECT COUNT(*) FROM table WHERE SLUG LIKE 'About-Us%'"
    
    上面的查询有一个问题。如果一个slug像About Uses那样出现,那么它返回的是计数1。我们需要检查的是最后一个破折号后面的部分是否为数字

    另外,像
    “About-Us-2-Know”
    这样的slug必须被视为不同于
    “About-Us”
    ,而
    “About-Us-2”或
    “About-Us-3”
    必须被视为是
    “About-Us”的多次出现

    编辑:


    这不是重复的。这不仅仅是检查最后一个字符是否为数字检查最后一个破折号之前的字符串是否完全匹配,最后一个破折号之后的字符串是否为数字

    以下是我仅使用MySql解决的问题。可能需要根据您的需要进行调整,但使用子字符串索引是我的主要解决方案

    /*
    'About-Us'
    'About-Us-2',
    'About-Us-3',
    'About-Us-5'
    */
    
    DROP TABLE IF EXISTS `bleach`;
    DROP TABLE IF EXISTS `bleach2`;
    
    CREATE TABLE bleach (slug VARCHAR (255) NOT NULL);
    
    INSERT INTO bleach SELECT 'About-Us';
    INSERT INTO bleach SELECT 'About-Us-2';
    INSERT INTO bleach SELECT 'About-Us-3';
    INSERT INTO bleach SELECT 'About-Us-5';
    INSERT INTO bleach SELECT 'About-Us-6-extra';
    INSERT INTO bleach SELECT 'About-Us-NoMatch';
    
    
    -- About us match
    CREATE TABLE bleach2
    SELECT slug, SUBSTRING_INDEX(slug,'-',2) AS about_us,
    SUBSTRING_INDEX(slug,'-',-1) AS  first_numeric,
    SUBSTRING_INDEX(SUBSTRING_INDEX(slug,'-',-2),'-',1) AS second_numeric  
    FROM bleach;
    
    SELECT * FROM bleach2;
    
    -- All but About-Us-NoMatch should return
    SELECT * FROM bleach2 WHERE about_us='About-Us' AND 
    (first_numeric IN ('1','2','3','4','5','6','7','8','9') OR second_numeric IN ('1','2','3','4','5','6','7','8','9'))
    OR second_numeric='About';
    

    可能的重复项不是重复项。这不仅仅是检查最后一个字符是否为数字。这是关于检查最后一个破折号之前的字符串是否完全匹配,最后一个破折号之后的字符串是否是数字。答案是一样的:使用正则表达式。如果你看了另一个答案并调整它,会发生什么?最可能的情况是,您只需将您的slug和破折号添加到“`[[:digit:][]”前面,根据链接问题回答:
    slug='About Us'或slug REGEXP'About Us-[0-9]+$”
    (您需要使用PHP
    preg_quote()
    函数来引用
    “About Us”
    。这是不好的,因为它不可伸缩。在OP的注释中使用REGEXP要好得多。我同意注释是最好的方法。我会这样做。但他没有提到php。只是试图回答问题。他的查询被引用,所以我猜这是隐含的。