SQL WordPress自定义查询内部联接

时间:2011-10-26 13:40:20

标签: mysql sql wordpress

我的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 

3 个答案:

答案 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