wordpress postmeta自定义查询问题

时间:2014-04-15 23:57:34

标签: php mysql wordpress

我正在尝试构建一个自定义查询,该查询将检查特定的postmeta字段以查看。当我没有使用“AND(b.meta_key ='x'AND b.meta_value ='y')”时,我遇到了返回太多行的问题。

有时,我会使用“b”......但并非总是如此。

在下面的第二个查询中,我返回了18行(每个元素填充一个+ 1个以上)。如何纠正这一点,以便我可以有多个postmeta匹配,而不是返回所有行。

此查询返回1个帖子

SELECT wp_posts.* 
FROM 
    wp_posts, 
    wp_postmeta a
WHERE 
    wp_posts.ID = a.post_id 

    AND (
    a.meta_key = 'property_space_requirement'
    AND a.meta_value = '1000' 
    )

AND wp_posts.post_status = 'publish' 
AND wp_posts.post_date < NOW()
ORDER BY wp_posts.post_date DESC

THES QUery返回18个帖子 - 如果我不使用“AND b”,我希望这只能从上面返回1

SELECT wp_posts.* 
FROM 
    wp_posts, 
    wp_postmeta a,
    wp_postmeta b
WHERE 
    wp_posts.ID = a.post_id 
    AND wp_posts.ID = b.post_id

    AND (
    a.meta_key = 'property_space_requirement'
    AND a.meta_value = '1000' 
    )

AND wp_posts.post_status = 'publish' 
AND wp_posts.post_date < NOW()
ORDER BY wp_posts.post_date DESC

此查询返回1个帖子

SELECT wp_posts.* 
    FROM 
        wp_posts, 
        wp_postmeta a,
        wp_postmeta b
    WHERE 
        wp_posts.ID = a.post_id 
        AND wp_posts.ID = b.post_id

        AND (
        a.meta_key = 'property_space_requirement'
        AND a.meta_value = '1000' 
        )

AND (
        b.meta_key = 'xx'
        AND b.meta_value = 'yy' 
        )

    AND wp_posts.post_status = 'publish' 
    AND wp_posts.post_date < NOW()
    ORDER BY wp_posts.post_date DESC

1 个答案:

答案 0 :(得分:1)

处理postmeta可能是颈部疼痛;你基本上需要为你想要查找的每个键值创建一个虚拟表。

您好像想要property_space_requirement = 1000和xx = yy的帖子,以及一些帖子标准。

这是你的postmeta虚拟表。

 SELECT post_id AS ID,
        meta_value AS property_space_requirement
   FROM wp_postmeta
  WHERE meta_key  = 'property_space_requirement'

同样适用于xx / yy

 SELECT post_id AS ID,
        meta_value AS xx
   FROM wp_postmeta
  WHERE meta_key  = 'xx'

然后你需要LEFT JOIN这些虚拟表到posts表,就像这样

SELECT p.*
  FROM wp_posts AS p
  LEFT JOIN (
               SELECT post_id AS ID,
                      meta_value AS property_space_requirement
                 FROM wp_postmeta
                WHERE meta_key  = 'property_space_requirement'
            ) AS a ON p.ID = a.ID
  LEFT JOIN (
               SELECT post_id AS ID,
                      meta_value AS xx
                 FROM wp_postmeta
                WHERE meta_key  = 'xx'
            ) AS b ON p.ID = b.ID
 WHERE p.post_status = 'publish'
   AND p.post_date < NOW()
   AND a.property_space_requirement = 1000
   AND b.xx = 'yy'
 ORDER BY p.post_date DESC

这里的技巧是使用子查询将postmeta的一个键的值转换为结果集中的一列,然后使用WHERE子句对其进行过滤。

请注意,您可以使用此设置使用各种更精细的WHERE过滤器。例如,你可以进行更精细的范围搜索,就像这样。

 WHERE ...
   AND (  (a.property_space_requirement <= 1000 AND b.xx = 'yy')
        OR(a.property_space_requirement > 1000 AND b.xx = 'zz') )
 ORDER BY a.property_space_requirement DESC

您可以通过LEFT JOIN新的虚拟表(如已经显示的两个虚拟表)为您的查询添加任意数量的键/值条件。

要注意:WordPress核心团队刚刚宣布他们将在明年退出旧的mysql_界面。查看如何使用WordPress的内部wpdb类。