【问题标题】:MySQL query with multiple AND's具有多个 AND 的 MySQL 查询
【发布时间】:2011-11-25 22:02:01
【问题描述】:

我是 MySQL 新手,使用 PHP 进行查询时遇到问题。见最后三行。

$query = "
SELECT post_content, slug, ID
FROM wp_posts

INNER JOIN wp_term_relationships
ON wp_posts.ID = wp_term_relationships.object_id

INNER JOIN wp_terms
ON wp_term_relationships.term_taxonomy_id = wp_terms.term_id

INNER JOIN wp_postmeta
ON wp_posts.ID = wp_postmeta.post_id

WHERE post_status = 'publish' AND slug = 'a-slug' AND meta_key <> 'include' AND meta_key <> 'exkludera'
OR post_status = 'publish' AND slug = 'a-slug' AND meta_key = 'include' AND meta_value = '72'
OR post_status = 'publish' AND slug = 'a-slug' AND meta_key = 'exclude' AND meta_value <> '72'
";

我想说的最后三行:

第 1 行)选择查询,如果: 已发布,有 a-slug 且没有 meta_key “包含”或“排除”

第 2 行)选择查询,如果: 是发布,有一个-slug,有meta_key“包含”和meta_value是'72'

第 3 行)选择查询,如果: 是发布,有一个-slug,有meta_key“排除”和meta_value不是'72'

但它给了我每次选择的两倍或三倍。 仅当它与这三个场景之一匹配时才应选择它。我做错了什么?

【问题讨论】:

    标签: php mysql wordpress where


    【解决方案1】:

    你需要使用括号:

    WHERE (post_status = 'publish' AND slug = 'a-slug' AND meta_key <> 'include' AND meta_key <> 'exkludera')
    OR (post_status = 'publish' AND slug = 'a-slug' AND meta_key = 'include' AND meta_value = '72')
    OR (post_status = 'publish' AND slug = 'a-slug' AND meta_key = 'exclude' AND meta_value <> '72')
    

    只需像您在示例中那样混合 ORAND 语句,对于 post_status = 'publish' 的所有情况,计算结果为 true

    顺便说一句,我假设 Row 1) 等是指代码中的行,而不是您希望从数据库返回的行...

    【讨论】:

    • 我试过了,但没有区别。是的,“第 1 行第 2 行和第 3 行”我的意思是我的示例中的最后三行。请再看看。
    • 您的join 中可能还有一个问题;你得到重复的行吗?
    • 是的,我有两三个重复的行。将在没有连接的情况下尝试。
    • @Hakan 我对 Wordpress 不太熟悉,所以我不知道所有字段的来源,但是一个一个添加(左...)连接可能会告诉你问题出在哪里是。
    【解决方案2】:

    在不同的标准集周围加上括号应该会有所帮助。

    例如

    $query = "
    ...
    WHERE 
    (post_status = 'publish' AND slug = 'a-slug' AND meta_key <> 'include' AND meta_key <> 'exkludera')
    OR 
    (post_status = 'publish' AND slug = 'a-slug' AND meta_key = 'include' AND meta_value = '72')
    OR 
    (post_status = 'publish' AND slug = 'a-slug' AND meta_key = 'exclude' AND meta_value <> '72')
    ";
    

    事实上,由于有些标准是通用的,你可以这样重写:

    $query = "
    ...
    WHERE 
    post_status = 'publish' AND slug = 'a-slug' AND
    (
     (meta_key <> 'include' AND meta_key <> 'exkludera')
     OR 
     (meta_key = 'include' AND meta_value = '72')
     OR 
     (meta_key = 'exclude' AND meta_value <> '72')
    )
    ";
    

    如有必要,您还可以使用DISTINCT 确保每条记录只返回一份副本。

    SELECT DISTINCT post_content, slug, ID
    

    【讨论】:

    • 没有解决我的问题,但很高兴知道!谢谢!我已经找到了问题,最后三行没有连接。所以这一定是关于他们的……
    【解决方案3】:

    我也遇到过同样的问题。

    我认为问题在于您在将 OR 与您正在使用的 AND 组合时没有包装您的 OR。当同时使用 OR 和 AND 时,它们必须用括号“()”括起来,否则会发生冲突。

    这是一个链接,显示了示例和详细说明其工作原理的说明: http://www.w3schools.com/sql/sql_and_or.asp

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-12-11
      • 2012-05-23
      • 1970-01-01
      • 1970-01-01
      • 2023-03-17
      • 2012-05-13
      相关资源
      最近更新 更多