更有效的方法来聚合和重新列出结果?

时间:2014-03-14 09:30:35

标签: php mysql wordpress

我有一个查询,它将一堆数据聚合成一个很好的,可读的列,来自一个相当混乱的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

1 个答案:

答案 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%';