Mysql SQL查询中的THEN语句
我正在尝试修改Wordpress搜索查询,以便它返回更广泛的结果 场景: 数据库中有一个后条目标题“旋转木马手表”。当我搜索这些单词中的一个(或两个)时,我得到了返回的帖子,这是我所期望的 然而,如果我搜索“旋转木马手表礼物”,我不会得到任何结果 此搜索的SQL查询如下所示: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
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
我的问题是:
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