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

标签 php mysql wordpress

我有一个查询,它将来自相当困惑的“wp_postmeta”WP 集的一堆数据聚合成漂亮、可读的列。不幸的是,它真的很慢,我很确定,因为那里有“LIKE '%whatever%'”。不幸的是,我需要在多种可能性中测试字符串是否存在。更快地获得这些结果的方法?此外,我不想遍历我的结果来查找与另一个区域的单个字段相关的信息 - 相反,我想在此查询期间将该信息联系起来。查询如下,后面是我想要的搭配:

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”提供元值“6507”,则关联的 URL 将位于数据库中的其他位置。

所以,原来的“image1”是这样的:

meta_id   |   post_id   |   meta_key   |   meta_value
----------|-------------|--------------|-------------
51520     |   6543      |    image1    |    6507
51521     |   6543      |    image2    |    6508

image1 (6507) 的 URL 来自其他地方,如下所示:

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

最佳答案

您在这里结合了两种不同的技术 - 我认为这很好......但有点奇怪。在实践中,第三种方法(我认为)会稍微快一些,但性能 killer 始终是类似条件开头的“%”。它阻止使用索引。

但是在我们开始使用更快的方法之前,让我们尝试一下......

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

关于php - 更有效的方法来聚合和重新列列结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22400943/

相关文章:

PHP多字节替代UTF8

php - 这是防止 SQL 注入(inject)的正确方法吗?

Wordpress 自定义帖子类型 - 相同的帖子名称,不同的帖子类型

mysql - 如何根据表中的组创建新列?

wordpress - 如何将wordpress中的价格四舍五入到最接近的值?

php - Mysql数据库未插入值

php - 从数据库中加载可见区域的标记

php - 对于购物车,您会使用哪个来设置 cookie(PHP 或 JavaScript)?

php - 单击浏览器的后退按钮后保留表单值

python - PyMySQL 插入 NULL 或字符串