我的SQL语句有些困难。我正在对WordPress进行查询,以显示基于多个帖子元字段的帖子。当我执行查询并仅使用一个元字段进行过滤,或者多次使用OR时,它可以正常工作,但是在多个AND上失败。
SELECT wposts . *
FROM wp_posts wposts
INNER JOIN (
SELECT post_id
FROM wp_postmeta wpostmeta
WHERE (
(wpostmeta.meta_key = 'ulnooweg_business_industry'
AND wpostmeta.meta_value = 'Legal Services')
AND (
wpostmeta.meta_key = 'ulnooweg_business_province'
AND wpostmeta.meta_value = 'New Brunswick')
)
GROUP BY post_id
)
AS t ON t.post_id = wposts.ID
WHERE wposts.post_status = 'publish'
AND wposts.post_type = 'business'
ORDER BY wposts.post_title ASC
LIMIT 0 , 30
答案 0 :(得分:2)
您的查询正在测试meta_key(和meta_value)是否在同一行中是2个不同的值,这是不可能的。但我明白你要做什么..
尝试加入wp_postmeta表两次,除了每个都有一个ON子句,该子句排除除满足meta_key条件的那些行之外的所有行:
SELECT
p.*,
GROUP_CONCAT(CONCAT(pm.meta_key,':',pm.meta_value) SEPARATOR ',') AS meta_values
FROM
wp_posts p
JOIN wp_postmeta pm ON pm.post_id = p.ID
JOIN wp_postmeta pm_bi ON (pm_bi.post_id = p.ID AND pm_bi.meta_key = 'ulnooweg_business_industry')
JOIN wp_postmeta pm_bp ON (pm_bp.post_id = p.ID AND pm_bp.meta_key = 'ulnooweg_business_province')
WHERE
pm_bi.meta_value = 'Legal Services'
AND pm_bp.meta_value = 'New Brunswick'
AND p.post_type = 'business'
AND p.post_status = 'publish'
GROUP BY p.ID
ORDER BY p.post_title ASC
注意:我在这里加入wp_postmeta表3次以帮助证明条件已满足,但是你可以删除GROUP_CONCAT行(当然是前一行的逗号)和第一次JOIN到wp_postmeta,查询将同样的工作。
答案 1 :(得分:0)
在子查询中,看起来它正在查找wpostmeta.meta_key = 'ulnooweg_business_industry'
和wpostmeta.meta_key = 'ulnooweg_business_province'
的记录 - 换句话说,wpostmeta.meta_key
需要同时等于两个字符串以满足此条件。此外,它正在寻找wpostmeta.meta_value = 'Legal Services'
和wpostmeta.meta_value = 'New Brunswick'
。
我的猜测是,这是你想要的子查询的WHERE
子句 - 将AND
中的一个更改为OR
:
....
WHERE (
(wpostmeta.meta_key = 'ulnooweg_business_industry'
AND wpostmeta.meta_value = 'Legal Services')
OR ( -- changed to an OR
wpostmeta.meta_key = 'ulnooweg_business_province'
AND wpostmeta.meta_value = 'New Brunswick')
)
....
答案 2 :(得分:0)
问题出在你内心选择的where子句中;我猜wpostmeta返回MULTIPLE行。先前的注释,字符串不能是两个值是正确的。如果第一种方法不是
,第二种方法应该有效起初我以为
WHERE
((wpostmeta.meta_key = 'ulnooweg_business_industry' AND wpostmeta.meta_value = 'Legal Services') OR
(wpostmeta.meta_key = 'ulnooweg_business_province' AND wpostmeta.meta_value = 'New Brunswick'))
Group by Post_ID
HAVING count(post_ID) = 2
只有在每种类型的条目的wpostmeta中只有一条记录时,这才会起作用。如果 postmeta.meta_key ='ulnooweg_business_industry'和wpostmeta.meta_value ='法律服务'可能会发生两次,然后上述情况不起作用。
第二种方法
Select wposts.*
FROM WP_Posts wposts
INNER JOIN (
Select POST_ID from WP_POSTMeta where meta_key = 'ulnooweg_business_industry' AND wpostmeta.meta_value = 'Legal Services'
INTERSECT
SELECT POST_ID FROM WP_POST_META WHERE meta_key = 'ulnooweg_business_province' AND wpostmeta.meta_value = 'New Brunswick'
)
AS T on T.Post_ID = wposts.ID