【问题标题】:Multiple MySQL Queries in ONE While Ignoring Duplicate Matched IDs一个中的多个 MySQL 查询,同时忽略重复的匹配 ID
【发布时间】:2015-04-09 17:48:07
【问题描述】:

我问了一个问题Combine Multiple MySQL Queries on the Same Table Into One 并收到了一个noteworthy answer 感谢@Paul Griffin

正如我在上面链接的另一个问题中所述,我将多个查询合并为一个查询。这些查询包括完全匹配和广泛匹配的搜索词。

我正在搜索 WordPress 网站上的帖子。为简单起见,我正在查看帖子表中的以下列:post_title(文章标题)、post_name(文章 URL Slug)和 post_excerpt(文章摘要)。

为了这个问题,为了让事情变得更简单,假设我有一个搜索词“Floor Finish”,我只搜索post_title 列。

如前所述,我正在寻找完全匹配和广泛匹配。

因此将放置三个搜索:

  1. 地板饰面
  2. 地板
  3. 完成

这会产生如下查询:

( SELECT `ID`, `post_title` FROM `tps_3_posts` WHERE `post_status` = 'publish' AND `post_title` LIKE '%floor finish%' ) 

UNION 

( SELECT `ID`, `post_title` FROM `tps_3_posts` WHERE `post_status` = 'publish' AND `post_title` LIKE '%floor%' ) 

UNION 

( SELECT `ID`, `post_title` FROM `tps_3_posts` WHERE `post_status` = 'publish' AND `post_title` LIKE '%finish%' )

检查我的查询后,我开始意识到这不是很有效。

它首先放置“精确匹配”(“Floor Finish”)搜索,然后是每个“Broad Match”(“Floor”、“Finish”)搜索。

所以第一次去,在文章标题的某处找到所有带有“Floor Finish”的帖子。

所以应该已经选择了一个 ID 列表。

现在,当 MySQL 进行第二次搜索时(第一次“广泛匹配”(“Floor”)搜索。)它正在查看所有帖子以查找包含“Floor”的文章标题匹配。这包括查看已经从完全匹配中找到的相同帖子(我不想要 - 似乎多余。)。

每次广泛搜索都会继续使用相同的行为。从而导致不必要的搜索。

那么有什么办法,将多个查询合并为一个,每个后续查询都不会查看已经选择了ID(列)和post_title(列)的帖子?

或另一种措辞...选择相同列但具有不同搜索词的每个查询都会检查是否已经选择了ID(列)和post_title(列),如果是这样,请忽略该ID,并继续寻找尚未被选中的新ID

或者 MySQL 是否已经在内部处理了这个问题,因为我将多个查询合并到一个查询中?

编辑

看来我把这一切都复杂化了。使用选定的答案,并查询我的问题顶部提到的所有三列。 (post_title, post_name, post_excerpt)

查询如下所示:

(

SELECT `ID` , `post_name` , NULL AS `post_title` , NULL AS `post_excerpt`
FROM `tps_3_posts`
WHERE `post_status` = 'publish' 
AND (
`post_name` LIKE '%floor-finish%' OR 
`post_name` LIKE '%floor%' OR 
`post_name` LIKE '%finish%'
)

) UNION (

SELECT `ID` , NULL AS `post_name` , `post_title` , NULL AS `post_excerpt`
FROM `tps_3_posts`
WHERE `post_status` = 'publish' 
AND (
`post_title` LIKE '%floor finish%' OR 
`post_title` LIKE '%floor%' OR 
`post_title` LIKE '%finish%'
)

) UNION (

SELECT `ID` , NULL AS `post_name` , NULL AS `post_title` , `post_excerpt`
FROM `tps_3_posts`
WHERE `post_status` = 'publish' 
AND (
`post_excerpt` LIKE '%floor finish%' OR 
`post_excerpt` LIKE '%floor%' OR 
`post_excerpt` LIKE '%finish%'
)

)

【问题讨论】:

  • 您必须执行EXPLAIN 才能查看正在使用的索引。

标签: php mysql sql database wordpress


【解决方案1】:

尝试使用or

SELECT `ID`, `post_title`
FROM `tps_3_posts`
WHERE `post_status` = 'publish' AND
      (`post_title` LIKE '%floor finish%' OR
       `post_title` LIKE '%floor%' OR
       `post_title` LIKE '%finish%'
      );

MySQL 不会解析LIKE 表达式并确定一个like 是另一个like 的子集。

编辑:

如果您想知道有多少值匹配,只需在select 中包含信息:

SELECT `ID`, `post_title`,
       ((`post_title` LIKE '%floor finish%') +
        (`post_title` LIKE '%floor%') +
        (`post_title` LIKE '%finish%')
       ) as nummatches          
FROM `tps_3_posts`
WHERE `post_status` = 'publish' AND
      (`post_title` LIKE '%floor finish%' OR
       `post_title` LIKE '%floor%' OR
       `post_title` LIKE '%finish%'
      );

完全匹配的值为 3。

【讨论】:

  • 我想我可以这样做,然后使用 PHP 来确定它是完全匹配还是广泛匹配。我只是想以一种快速的动作尽可能多地完成。
猜你喜欢
  • 2019-04-23
  • 1970-01-01
  • 1970-01-01
  • 2011-11-06
  • 1970-01-01
  • 1970-01-01
  • 2014-06-01
  • 2011-12-18
  • 1970-01-01
相关资源
最近更新 更多