我得到了下面的SQL语句,它在MySQL中运行在WordPress安装上。我正在寻找符合特定标准的元数据,并在某个日期之后创建。
但是,WordPress不存储元数据被添加到帖子中的日期,所以我创建了元数据本身(wpcf-post-like)、它添加的日期(wpcf-post-like- date )和第三块元数据,该元数据是同时创建的,其中包含了前两个由感叹号分隔的ID (wpcf-post-like- date -link)。
然后,我使用下面的SQL语句在特定日期后在由当前作者编写的帖子(例如ID包含在下面的SQL代码中)上获得赞。它工作,但它需要7-8秒左右的运行,这是远远不理想的。是否有一个更有效的版本相同的声明?
SELECT `meta_id` FROM `wp_postmeta`
WHERE `post_id` IN (
SELECT `ID` FROM `wp_posts` WHERE post_author = $user_id
) AND
`meta_value` IN (
SELECT CONCAT(combined_ids_a.`meta_id`, '!', combined_ids_b.`meta_id`) AS `combined_meta_id` FROM (
SELECT `meta_id`, 'like_id' AS `meta_type` FROM `wp_postmeta`
WHERE `meta_key` LIKE 'wpcf-post-likes'
AND `meta_value` NOT LIKE '1837'
AND `meta_id` IN
(SELECT SUBSTRING_INDEX(`meta_value`, '!', 1) FROM `wp_postmeta` WHERE `meta_key` LIKE 'wpcf-post-like-date-link' ORDER BY `meta_id` DESC)
UNION
SELECT `meta_id`, 'like_date' AS `meta_type` FROM `wp_postmeta`
WHERE `meta_key` LIKE 'wpcf-post-like-date'
AND `meta_value` > '01-02-2016 09:20:34'
AND `meta_id` IN
(SELECT SUBSTRING_INDEX(`meta_value`, '!', -1) FROM `wp_postmeta` WHERE `meta_key` LIKE 'wpcf-post-like-date-link' ORDER BY `meta_id` DESC)
) AS combined_ids_a JOIN
(
SELECT `meta_id`, 'like_id' AS `meta_type` FROM `wp_postmeta`
WHERE `meta_key` LIKE 'wpcf-post-likes'
AND `meta_value` NOT LIKE '1837'
AND `meta_id` IN
(SELECT SUBSTRING_INDEX(`meta_value`, '!', 1) FROM `wp_postmeta` WHERE `meta_key` LIKE 'wpcf-post-like-date-link' ORDER BY `meta_id` DESC)
UNION
SELECT `meta_id`, 'like_date' AS `meta_type` FROM `wp_postmeta`
WHERE `meta_key` LIKE 'wpcf-post-like-date'
AND `meta_value` > '01-02-2016 09:20:34'
AND `meta_id` IN
(SELECT SUBSTRING_INDEX(`meta_value`, '!', -1) FROM `wp_postmeta` WHERE `meta_key` LIKE 'wpcf-post-like-date-link' ORDER BY `meta_id` DESC)
) AS combined_ids_b
);
发布于 2016-02-01 16:14:17
建议用这个盯着看:
AND `meta_id` IN
(SELECT SUBSTRING_INDEX(`meta_value`, '!', 1)
FROM `wp_postmeta`
WHERE `meta_key`
LIKE 'wpcf-post-like-date-link'
ORDER BY `meta_id`
DESC)
与文本搜索、顺序排序一样,同一wp_postmeta
表上的附加子查询是执行冗长查询的来源。将子查询重写为联接
https://codereview.stackexchange.com/questions/118522
复制相似问题