我从xml文件导入到wordpress数据库。我将城镇和地点作为每个帖子的元值导入。
我没有城镇和地点的预定清单,所以我需要获取所有地点(简单的事情)并获得这些地点内的所有城镇(我在这里遇到问题)
我现在的查询是:
SELECT t1.meta_value
FROM wp_postmeta t1
INNER JOIN wp_postmeta t2 ON (t1.post_id = t2.post_id)
WHERE t2.meta_key = '_prop_loc'
AND t2.meta_value="Málaga"
AND t1.meta_key = '_prop_town'
GROUP BY t1.meta_value
例如,如果我试图获取“Málaga”位置的所有城镇,我结束使用此查询。在localhost上测试它运行查询
showing records 0 - 29 ( 101 total, total time 1.3289 seg)
如果我按时间减少取出组,但当然我会得到重复的行。如果我在订单ASC中使用select distinct,则时间会再次上升。
我确实想要对结果进行排序,但查询超过一秒钟就不行了
wp_postmeta
表:
CREATE TABLE `wp_postmeta` (
`meta_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`post_id` bigint(20) unsigned NOT NULL DEFAULT '0',
`meta_key` varchar(255) DEFAULT NULL,
`meta_value` longtext,
PRIMARY KEY (`meta_id`),
KEY `post_id` (`post_id`),
KEY `meta_key` (`meta_key`)
) ENGINE=*** DEFAULT CHARSET=utf8;
答案 0 :(得分:2)
我假设您没有在默认WP设计上添加任何其他索引。
您可以在(meta_key, meta_value, post_id)
和(meta_key, post_id, meta_value)
上的一个。
更新:meta_value
是text
列,因此这不是一个选项。您可以尝试在该列上创建第一个部分索引,而不是将其包含在第二个索引中:
ALTER TABLE wp_postmeta
ADD INDEX meta_key__meta_value__post_id__IX
(meta_key, meta_value(20), post_id),
ADD INDEX meta_key__post_id__IX
(meta_key, post_id) ;
您也可以尝试重写查询:
SELECT t1.meta_value
FROM wp_postmeta t1
WHERE t1.meta_key = '_prop_town'
AND EXISTS
( SELECT *
FROM wp_postmeta t2
WHERE t2.meta_key = '_prop_loc'
AND t2.meta_value = "Málaga"
AND t2.post_id = t1.post_id
)
GROUP BY t1.meta_value ;