我有一个查询,它将来自相当困惑的“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/