Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql SQL查询中的THEN语句_Mysql_Sql - Fatal编程技术网

Mysql SQL查询中的THEN语句

Mysql SQL查询中的THEN语句,mysql,sql,Mysql,Sql,我正在尝试修改Wordpress搜索查询,以便它返回更广泛的结果 场景: 数据库中有一个后条目标题“旋转木马手表”。当我搜索这些单词中的一个(或两个)时,我得到了返回的帖子,这是我所期望的 然而,如果我搜索“旋转木马手表礼物”,我不会得到任何结果 此搜索的SQL查询如下所示: SELECT SQL_CALC_FOUND_ROWS sosen_posts.ID FROM sosen_posts WHERE 1=1 AND (((sosen_posts.post_title LIKE '%caro

我正在尝试修改Wordpress搜索查询,以便它返回更广泛的结果

场景:

数据库中有一个后条目标题“旋转木马手表”。当我搜索这些单词中的一个(或两个)时,我得到了返回的帖子,这是我所期望的

然而,如果我搜索“旋转木马手表礼物”,我不会得到任何结果

此搜索的SQL查询如下所示:

SELECT SQL_CALC_FOUND_ROWS sosen_posts.ID FROM sosen_posts WHERE 1=1 
AND (((sosen_posts.post_title LIKE '%carousel%') OR (sosen_posts.post_content LIKE '%carousel%')) 
    AND ((sosen_posts.post_title LIKE '%watch%') OR (sosen_posts.post_content LIKE '%watch%')) 
    AND ((sosen_posts.post_title LIKE '%gift%') OR (sosen_posts.post_content LIKE '%gift%'))) 
AND (sosen_posts.post_password = '') AND sosen_posts.post_type = 'wp_aff_products' AND (sosen_posts.post_status = 'publish') 
    ORDER BY 
    (CASE WHEN sosen_posts.post_title LIKE '%carousel watch gift%' 
        THEN 1 
        WHEN sosen_posts.post_title LIKE '%carousel%' AND sosen_posts.post_title LIKE '%watch%' AND sosen_posts.post_title LIKE '%gift%' 
        THEN 2 
        WHEN sosen_posts.post_title LIKE '%carousel%' OR sosen_posts.post_title LIKE '%watch%' OR sosen_posts.post_title LIKE '%gift%' 
        THEN 3 
        WHEN sosen_posts.post_content LIKE '%carousel watch gift%' 
        THEN 4 ELSE 5 END), sosen_posts.post_date DESC LIMIT 0, 3
我的问题是:

  • 查询的哪一部分阻止返回结果(“Carosuel Watch”)
  • 我应该如何修改它以得到返回的结果
  • 最后,
    THEN
    语句在这个查询中做什么?它是否在
    WHERE
    语句中设置要比较的值

  • THEN
    关键字用作
    CASE
    子句的一部分。
    CASE
    子句如下所示:

    CASE WHEN expression THEN value WHEN otherexpression THEN othervalue ... END
    
    表达式的结果是一个值(有时您会看到人们试图使用
    CASE
    子句来确定要执行的代码,但这不起作用)

    在此查询中,
    案例
    类别中的值用于确定帖子的排序顺序,与结果中包括或不包括哪些记录无关

    为了找出结果中包含哪些记录,我们需要剖析
    WHERE
    子句。为了便于阅读,我重新设置了现有条款的格式,如下所示:

    WHERE 1=1  AND (
        (sosen_posts.post_title LIKE '%carousel%' OR sosen_posts.post_content LIKE '%carousel%') 
        AND (sosen_posts.post_title LIKE '%watch%' OR sosen_posts.post_content LIKE '%watch%') 
        AND (sosen_posts.post_title LIKE '%gift%' OR sosen_posts.post_content LIKE '%gift%')
    ) AND sosen_posts.post_password = '' AND sosen_posts.post_type = 'wp_aff_products' AND sosen_posts.post_status = 'publish'
    
    首先,1=1部分。这对于自动生成的代码很常见。无论是否存在任何条件,生成器都可以在
    WHERE
    子句的开头放置
    WHERE 1=1
    ,查询仍然有效。然后,对于每个条件,它总是可以使用形式
    和条件
    ,而不必担心WHERE子句的先前状态

    进入下一节,我们会看到它会根据标题和文本分别检查每个关键字。这些检查通过
    操作员连接。这意味着,如果你的帖子标题或正文中没有单词
    gift
    ,它就不能出现在结果中


    最后,这段代码效率极低。您永远不希望看到像
    这样的带有前导通配符(
    %
    )的
    运算符,因为它几乎保证您不能使用任何索引来满足该条件。我更喜欢Sql Server,但在Sql Server-land中,您要做的是创建一种特殊的索引,称为
    全文
    索引,并使用特殊的
    CONTAINS()
    子句编写查询。否则,您将使用第三方搜索库,如Lucene。您永远不想使用
    LIKE
    查询进行这样的搜索。我不确定这些备选方案的MySql等价物是什么,但这里的内容并不是您想要的方式。

    THEN
    关键字用作
    CASE
    子句的一部分。
    CASE
    子句如下所示:

    CASE WHEN expression THEN value WHEN otherexpression THEN othervalue ... END
    
    表达式的结果是一个值(有时您会看到人们试图使用
    CASE
    子句来确定要执行的代码,但这不起作用)

    在此查询中,
    案例
    类别中的值用于确定帖子的排序顺序,与结果中包括或不包括哪些记录无关

    为了找出结果中包含哪些记录,我们需要剖析
    WHERE
    子句。为了便于阅读,我重新设置了现有条款的格式,如下所示:

    WHERE 1=1  AND (
        (sosen_posts.post_title LIKE '%carousel%' OR sosen_posts.post_content LIKE '%carousel%') 
        AND (sosen_posts.post_title LIKE '%watch%' OR sosen_posts.post_content LIKE '%watch%') 
        AND (sosen_posts.post_title LIKE '%gift%' OR sosen_posts.post_content LIKE '%gift%')
    ) AND sosen_posts.post_password = '' AND sosen_posts.post_type = 'wp_aff_products' AND sosen_posts.post_status = 'publish'
    
    首先,1=1部分。这对于自动生成的代码很常见。无论是否存在任何条件,生成器都可以在
    WHERE
    子句的开头放置
    WHERE 1=1
    ,查询仍然有效。然后,对于每个条件,它总是可以使用形式
    和条件
    ,而不必担心WHERE子句的先前状态

    进入下一节,我们会看到它会根据标题和文本分别检查每个关键字。这些检查通过
    操作员连接。这意味着,如果你的帖子标题或正文中没有单词
    gift
    ,它就不能出现在结果中


    最后,这段代码效率极低。您永远不希望看到像
    这样的带有前导通配符(
    %
    )的
    运算符,因为它几乎保证您不能使用任何索引来满足该条件。我更喜欢Sql Server,但在Sql Server-land中,您要做的是创建一种特殊的索引,称为
    全文
    索引,并使用特殊的
    CONTAINS()
    子句编写查询。否则,您将使用第三方搜索库,如Lucene。您永远不想使用
    LIKE
    查询进行这样的搜索。我不确定这些备选方案的MySql等价物是什么,但这里的内容并不是您想要的方式。

    THEN
    关键字用作
    CASE
    子句的一部分。
    CASE
    子句如下所示:

    CASE WHEN expression THEN value WHEN otherexpression THEN othervalue ... END
    
    表达式的结果是一个值(有时您会看到人们试图使用
    CASE
    子句来确定要执行的代码,但这不起作用)

    在此查询中,
    案例
    类别中的值用于确定帖子的排序顺序,与结果中包括或不包括哪些记录无关

    为了找出结果中包含哪些记录,我们需要剖析
    WHERE
    子句。为了便于阅读,我重新设置了现有条款的格式,如下所示:

    WHERE 1=1  AND (
        (sosen_posts.post_title LIKE '%carousel%' OR sosen_posts.post_content LIKE '%carousel%') 
        AND (sosen_posts.post_title LIKE '%watch%' OR sosen_posts.post_content LIKE '%watch%') 
        AND (sosen_posts.post_title LIKE '%gift%' OR sosen_posts.post_content LIKE '%gift%')
    ) AND sosen_posts.post_password = '' AND sosen_posts.post_type = 'wp_aff_products' AND sosen_posts.post_status = 'publish'
    
    首先,1=1部分。这对于自动生成的代码很常见。无论是否存在任何条件,生成器都可以在
    WHERE
    子句的开头放置
    WHERE 1=1
    ,查询仍然有效。然后,对于每个条件,它总是可以使用形式
    和条件
    ,而不必担心abo