【发布时间】: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 列。
如前所述,我正在寻找完全匹配和广泛匹配。
因此将放置三个搜索:
- 地板饰面
- 地板
- 完成
这会产生如下查询:
( 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