WordPress / MySQL子查询问题

时间:2014-10-16 09:11:10

标签: php mysql sql wordpress woocommerce

我正在为使用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

但是,当我想添加另一个过滤器,例如Carrier,即'USPS'时,会返回一个空结果。添加以下内容时:

AND meta_value LIKE 'USPS' )

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

1 个答案:

答案 0 :(得分: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'正确的值。