SQL连接表的结果为2个语句

时间:2015-06-16 14:51:19

标签: php mysql sql-server wordpress join

我试图通过JOIN从我的Wordpress数据库中获取SQL数据,但是我没有让它工作。

我需要什么:

  • meta_key“gtp_product_dont_show”存在的帖子以及meta_value不是“true”的帖子。
  • 并且meta_key“gtp_product_dont_show”不存在的帖子。

我的问题:

我现在只获得帖子有meta_key“gtp_product_dont_show”的结果,但也有帖子没有这个键,我也需要这些。

这就是我现在所拥有的:

SELECT 
    ID, post_title
FROM 
    wp_posts p
    JOIN wp_postmeta m ON 
        p.ID = m.post_id AND 
        m.meta_key = 'gtp_product_dont_show' AND 
        m.meta_value != 'true'
WHERE 
    post_type = 'products' AND 
    post_status = 'publish'

输出:

3 个答案:

答案 0 :(得分:1)

您需要left join

SELECT ID, post_title
FROM wp_posts p LEFT JOIN
     wp_postmeta m
     ON p.ID = m.post_id AND 
        m.meta_key = 'gtp_product_dont_show' 
WHERE (m.meta_value is null or m.meta_value <> 'true') and
      post_type = 'products' AND 
      post_status = 'publish';

left joinwp_postmeta表中查找适当的密钥。 where子句然后说&#34;当没有匹配或值不是真时保留记录&#34; - 我认为这是你正在寻找的逻辑。

答案 1 :(得分:0)

你在找这个吗?

SELECT 
    ID, post_title
FROM 
    wp_posts p
WHERE 
    post_type = 'products' AND 
    post_status = 'publish' AND
    not exists (
        select 1 
        from wp_postmeta m
        where 
        p.ID = m.post_id AND 
        m.meta_key = 'gtp_product_dont_show' AND 
        m.meta_value = 'true')

这将从wp_posts中获取所有行,但是忽略那些从wp_postmeta找到行的地方,其中meta_key是gtp_product_dont_show且值为true。

答案 2 :(得分:0)

您可以使用OR运算符来考虑这两种情况。试试这个:

SELECT stuff
FROM myTable
JOIN otherTable ON 
   (m.meta_key = 'gtp_product_dont_show' AND m.meta_value != 'true') OR 
   (m.meta_key != 'gtp_product_dont_show')
...

只是旁注,我不建议将布尔值存储为类似的字符串。您应该考虑使用TINYINT(),其中布尔字段存储为0表示为false,或者1表示为true。