【问题标题】:SQL WordPress Custom Query Inner JoinSQL WordPress 自定义查询内连接
【发布时间】:2011-10-26 13:40:20
【问题描述】:

我的 SQL 语句有些困难。我正在对 WordPress 进行查询以显示基于多个帖子元字段的帖子。当我只使用一个元字段或多个元字段进行查询和过滤时,它可以工作,但是多个元字段的 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 

【问题讨论】:

  • OR 和 AND 在逻辑上是不同的。你期待什么结果?
  • 是的,我知道这一点。我想要 AND,我想要过滤两个元值。我可以确认数据存在,但是我的声明没有返回。
  • 您的问题是什么?您的查询应该是什么样的?发布您尝试过的内容,即使它不起作用。
  • OP 正试图弄清楚他如何获得具有“法律服务”行业元键和“新不伦瑞克省”省元键的一组帖子。

标签: mysql sql wordpress


【解决方案1】:

您的查询正在测试 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 并且查询将工作相同。

【讨论】:

    【解决方案2】:

    在子查询中,它看起来像是在寻找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 子句中想要的——将ANDs 之一更改为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')
    )
    ....
    

    【讨论】:

    • +1 不错的收获。回答一个问题已经够难了,自己找到问题就更难了。
    • OP 明确表示他已经发现它可以与 OR 一起使用,但他正试图弄清楚如何获得具有“法律服务”行业元键和'New Brunswick' 的省元键。
    • @ghbarratt - 实际上,尚不清楚 OP 想要什么。它说他在某事上做了OR,并且它起作用了......但它是什么?但是,由于我提到的原因,发布的代码显然必须不返回任何结果。
    【解决方案3】:

    问题出在你的内部选择的 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' AND wpostmeta.meta_value = 'Legal Services' 可以出现两次,那么上面的就不行了。

    第二种方法

    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
    

    【讨论】:

      猜你喜欢
      • 2014-11-17
      • 2018-09-05
      • 1970-01-01
      • 1970-01-01
      • 2017-10-19
      • 2016-03-29
      • 2015-06-21
      • 2013-07-06
      • 1970-01-01
      相关资源
      最近更新 更多