mysql - SQL 左连接没有给我空条目

标签 mysql wordpress

我正在为 WordPress 制作一个 RSS feed,要求是如果文章设置了促销日期,则应按促销日期排序,否则使用 post_date 否则我来了 执行以下 SQL。

SELECT $wpdb->posts.* from $wpdb->posts 
LEFT JOIN $wpdb->term_relationships ON ($wpdb->posts.ID = $wpdb->term_relationships.object_id)
LEFT JOIN $wpdb->term_taxonomy ON ($wpdb->term_relationships.term_taxonomy_id = $wpdb->term_taxonomy.term_taxonomy_id) 
LEFT JOIN $wpdb->terms ON ($wpdb->term_taxonomy.term_id = $wpdb->terms.term_id) 
LEFT JOIN $wpdb->postmeta as m2 on ($wpdb->posts.ID=m2.post_id and m2.meta_key='promotion_date') 
where now()>(CASE WHEN m2.meta_value IS NOT NULL 
    then cast(m2.meta_value as DATETIME) 
    ELSE $wpdb->posts.post_date END) 
and $wpdb->posts.post_status='publish' 
and $wpdb->posts.post_type='article' 
and $wpdb->terms.slug = $slug 
and $wpdb->term_taxonomy.taxonomy = 'article_$taxonomy' 
order by CASE WHEN m2.meta_value IS NOT NULL 
      then cast(m2.meta_value as DATETIME) 
      ELSE $wpdb->posts.post_date 
END DESC limit 100;

问题是左连接似乎不会返回没有促销日期的条目。当没有匹配项时,左连接通常会选择第一个表中的所有列,而第二个表中的条目为空。为什么这种情况没有发生?

最佳答案

您在查询 $slug 的“terms”和 WHERE 子句中的“term_taxonomy”时有两个“AND”条件,从而将您的 LEFT-JOIN 转换为 INNER-JOIN。我已将它们移至 LEFT JOIN 组件。否则你应该很好(另外,我只是为表格应用了别名,而不是为了可读性而进行长手写)

SELECT 
      p.* 
   from 
      $wpdb->posts p
         LEFT JOIN $wpdb->term_relationships tr
            ON p.ID = tr.object_id
            LEFT JOIN $wpdb->term_taxonomy tt
               ON tr.term_taxonomy_id = tt.term_taxonomy_id
              and tt.taxonomy = 'article_$taxonomy' 
               LEFT JOIN $wpdb->terms t 
                  ON tt.term_id = t.term_id
                 and t.slug = $slug 
         LEFT JOIN $wpdb->postmeta as m2 
            on p.ID = m2.post_id 
            and m2.meta_key = 'promotion_date'
   where 
          now() > ( CASE WHEN m2.meta_value IS NOT NULL 
                     then cast(m2.meta_value as DATETIME) 
                     ELSE p.post_date END )
      and p.post_status = 'publish' 
      and p.post_type = 'article' 
   order by 
      CASE WHEN m2.meta_value IS NOT NULL 
         then cast(m2.meta_value as DATETIME) 
         ELSE p.post_date END DESC 
   limit 100;

为了查询性能,我建议在帖子表上建立索引(post_status、post_type、post_date)

关于mysql - SQL 左连接没有给我空条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25806322/

相关文章:

mysql - #1064 SQL 语法错误

mysql - 具有相同列的 MySQL 中的 DateDiff

php - Woocommerce - 结帐页面上的订单审核总数未刷新

wordpress - 所有键的 get_post_meta 带回数组,而不是单个值

mysql - 需要编辑 Wordpress 数据库中的哪些表以迁移到新的 URL?

php - 寻找一段时间内活跃/不活跃用户的策略

mysql 查询问题 - 生成再订购报告

php - 用类查找元素并在php字符串中添加一个

wordpress - IIS 服务器阻止访问 .webp 文件

php - 使用 php mysql 和 inner join 重复结果