我有一个查询,它将一堆数据聚合成一个很好的,可读的列,来自一个相当混乱的WP集" wp_postmeta"。不幸的是,它的真的慢,我非常确定,因为" LIKE'%无论%'在那里。不幸的是,我需要在许多可能性中测试字符串的存在。有更快的方法来获得这些结果?此外,我喜欢不必遍历我的搜索结果,查找与来自其他区域的单个字段相关的信息 - 相反,我想在此查询期间将该信息绑定。查询如下,然后是我想要的搭配:
SELECT post_id,
MAX(CASE WHEN meta_key = 'size' THEN meta_value END) size,
MAX(CASE WHEN meta_key = 'image1' THEN meta_value END) image1,
MAX(CASE WHEN meta_key = 'image2' THEN meta_value END) image2
FROM wp_postmeta WHERE post_id IN (SELECT post_id from wp_postmeta
WHERE meta_key='location' AND meta_value LIKE '%Run Of Site%')
GROUP BY post_id
返回一个漂亮可读的结果,就像这样,但非常慢:
Post_id | size | image1 | image2
----------|-------------|--------------|-------------
6528 | Large | 6507 | 6508
现在搭配了。字段" image1"," image2"等每个都显示一个id号。该id是图像附件的post_id,它在另一个地方有一个url。例如,如果" image1"提交了meta_value' 6507',然后相关的URL将在其他地方的数据库中。
所以,原作" image1"是这样的:
meta_id | post_id | meta_key | meta_value
----------|-------------|--------------|-------------
51520 | 6543 | image1 | 6507
51521 | 6543 | image2 | 6508
image1的网址,(6507)来自其他地方,如下所示:
meta_id | post_id | meta_key | meta_value
----------|-------------|---------------|-------------
51518 | 6507 | attached_file | KS1.gif
51519 | 6508 | attached_file | KS2.gif
所以,我真正想要弄清楚的是如何正确地将我的查询与(a)速度相结合,以及(b)不必进行第二次查询,迭代URL。
所以我的结果看起来像这样:
Post_id | size | image1 | image2
----------|-------------|--------------|-------------
6528 | Large | KS1.gif | KS2.gif
答案 0 :(得分:0)
你在这里结合了两种不同的技术 - 我想这很好......但有点奇怪。在实践中,第三种方法(我认为)会快一点,但性能杀手总是会出现这样的情况:'%'在你喜欢的条件的开始。它阻止使用索引。
但在我们开始使用更快的方法之前,让我们试试这些......
SELECT m.post_id
, MAX(CASE WHEN m.meta_key = 'size' THEN m.meta_value END) size
, MAX(CASE WHEN m.meta_key = 'image1' THEN m.meta_value END) image1
, MAX(CASE WHEN m.meta_key = 'image2' THEN m.meta_value END) image2
FROM wp_postmeta m
JOIN wp_postmeta n
ON n.post_id = m.post_id
WHERE n.meta_key = 'location'
AND n.meta_value LIKE '%Run Of Site%'
GROUP
BY m.post_id
SELECT m.post_id
, MAX(CASE WHEN m.meta_key = 'size' THEN m.meta_value END) size
, MAX(CASE WHEN m.meta_key = 'image1' THEN m.meta_value END) image1
, MAX(CASE WHEN m.meta_key = 'image2' THEN m.meta_value END) image2
, MAX(CASE WHEN m.meta_key = 'location' THEN m.meta_value END) location
FROM wp_postmeta m
GROUP
BY m.post_id
HAVING m.location LIKE '%Run Of Site%';