我正在尝试构建一个自定义查询,该查询将检查特定的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
答案 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类。