【问题标题】:SQL join table result of 2 statements2条语句的SQL连接表结果
【发布时间】:2015-09-01 11:28:36
【问题描述】:

我正在尝试通过 JOIN 从我的 Wordpress 数据库中使用 SQL 获取数据,但我无法正常工作。

我需要什么:

  • 存在 meta_key "gtp_product_dont_show" 且 meta_value 不为 "true" 的帖子。
  • 以及元密钥“gtp_product_dont_show”不存在的帖子。

我的问题:

我现在只得到帖子有元密钥“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'

输出:

【问题讨论】:

  • 请提供示例输入和输出
  • 然后从查询中删除 meta_key 内容。你告诉数据库只返回具有该值的记录。如果你想要没有的记录,那么你不能要求它在那里。 “你一定穿着绿色 T 恤,但不能穿绿色 - 嘿!为什么我没有得到任何绿色?”
  • @MarcB 我不认为它可以被删除。考虑m.meta_key = 'gtp_product_dont_show' and m.meta_value = 'true'的情况,我相信OP试图排除它。
  • 但是,我确实认为这个问题通过样本数据和预期结果会更清楚,我同意 Onur。

标签: php mysql sql-server wordpress join


【解决方案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 子句然后说“在不匹配或值不正确时保留记录”——我认为这是您正在寻找的逻辑。

【讨论】:

  • 我收到一个错误,上面写着:#1064 - 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在 'm.meta_value != 'true' WHERE (m.meta_value is null or m.meta_value 'true') an' 在第 6 行附近使用正确的语法跨度>
  • @罗伯特。 . .该行应该被删除。逻辑在where 子句中。
【解决方案2】:

您可以使用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。

【讨论】:

  • 感谢您的回答和布尔提示。我之前已经尝试过,但这不起作用。
  • @Robbert 你能添加一些示例数据和预期结果吗?我不太确定 meta_key 的“不存在”是什么意思。如果你能建立一个SQL Fiddle,那将是最有帮助的。
【解决方案3】:

你在找这个吗?

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 的行。

【讨论】:

    猜你喜欢
    • 2013-09-03
    • 2022-12-22
    • 2020-07-21
    • 1970-01-01
    • 2011-03-16
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    • 2016-07-31
    相关资源
    最近更新 更多