【问题标题】:WordPress/MySQL subquery problemsWordPress/MySQL 子查询问题
【发布时间】:2014-10-16 09:11:10
【问题描述】:

我正在使用 wordpress 和 Woocommerce 为客户创建一个运输插件。我有一个管理屏幕,显示所有带有可选过滤器的货件,即日期范围、承运商、服务方法等。我可以使用以下代码根据日期范围查询数据库中的记录。

SELECT ID
FROM wp_posts
WHERE post_type LIKE 'shop_order'
AND ID = ANY
   (SELECT post_id
    FROM wp_postmeta
    WHERE meta_value
    BETWEEN DATE_SUB( NOW( ) , INTERVAL 30 DAY AND NOW( ) );
LIMIT 0 , 30

但是,当我想添加另一个过滤器(例如运营商,即“USPS”)时,会返回一个空结果。添加以下内容时:

AND meta_value LIKE 'USPS' )

我在我的代码中使用 $wpdb,但是,上面是 phpmyadmin 中的直接调用。

【问题讨论】:

  • 有一些问题是您的查询..它在没有 meta_value LIKE 'USPS' 的情况下无法正常工作。请编辑它。
  • 首先修复 INTERVAL 30 DAY AND NOW( ) ) - INTERVAL 30 DAY) AND NOW( )。那为什么 meta_value 既是日期又是字符串呢?

标签: php mysql sql wordpress woocommerce


【解决方案1】:

我认为没有返回任何内容的原因是您试图同时过滤一个既是日期又是运营商的元值:

WHERE meta_value
  BETWEEN DATE_SUB( NOW( ) , INTERVAL 30 DAY AND NOW( )
  AND meta_value LIKE 'USPS'

相反,您可以尝试以下方法:

WHERE 
  ID IN 
  (
    SELECT post_id 
    FROM wp_postmeta 
    WHERE meta_key = 'date_key' 
      AND meta_value BETWEEN DATE_SUB( NOW( ) , INTERVAL 30 DAY AND NOW( ) )
  )
AND
  ID IN 
  (
    SELECT post_id
    FROM wp_postmeta 
    WHERE meta_key = 'carrier_key' 
      AND meta_value = 'USPS'
  )

或者多次加入元表可能会更整洁:

SELECT ID
FROM wp_posts
INNER JOIN wp_postmeta meta_date ON wp_posts.ID = meta_date.post_id AND meta_date.meta_key = 'date_key'
INNER JOIN wp_postmeta meta_carrier ON wp_posts.ID = meta_carrier.post_id AND meta_carrier.meta_key = 'carrier_key'
WHERE post_type LIKE 'shop_order'
  AND meta_date.meta_value BETWEEN DATE_SUB( NOW( ) , INTERVAL 30 DAY AND NOW( ) )
  AND meta_carrier.meta_value = 'USPS'
LIMIT 0 , 30

由于我不知道您使用的元键,您需要将“date_key”和“carrier_key”替换为正确的值。

【讨论】:

  • 谢谢,谢谢,谢谢...我想在不久前说这个,但我真的很忙于我的商业和研究生院。非常感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多