SQL和WPDB的困难,尤其是在WHERE子句中

时间:2018-09-12 13:47:46

标签: mysql sql wordpress

我很困惑

我有1/2打查询,所有查询都在MySQL Workbench中返回期望的结果,但是,从WPDB调用时什么也不返回。 我已经测试过WPDB使用非常简单的select语句,但是,当它们变得更加困难时,WPDB不喜欢我提供的内容。在尝试询问之前,我已经尝试了2天-遗憾的是,我没有从WPDB中得到任何错误,只是没有结果。

以下查询返回了一个库存日期,以后所有订单都可以发货。如果跑遍我自己。但是在WPDB中返回空数组。

我知道此SQL需要做一些工作,需要通过准备运行,并且应该使用WPDB前缀-如果我能使它工作,所有这些整理工作都将来。

我发现,仅通过舍弃where子句就可以得到结果-这就是我一直关注的地方。有人可以看到我做错了什么吗?还是最错误?

Select stocketa as NextDispatch From
(
Select ETA as stocketa,(@runtot := @runtot + q1.QtyInbound) AS QtyInbound_rt, (q1.SOH * -1) as InverseSOH FROM
(
Select  pm1.meta_value AS ETA,  OIM1.meta_value AS QtyInbound, pm2.meta_value as SOH
FROM wp_posts p 
LEFT JOIN wp_postmeta pm1 ON ( pm1.post_id = p.ID  AND pm1.meta_key    = '_expected_at_location_date')
LEFT JOIN wp_atum_order_items OI ON ( OI.order_id = p.id)
LEFT JOIN wp_atum_order_itemmeta OIM1 ON (OIM1.order_item_id =OI.order_item_id AND OIM1.meta_key='_qty' )
LEFT JOIN wp_atum_order_itemmeta OIM2 ON (OIM2.order_item_id =OI.order_item_id AND OIM2.meta_key='_product_id' )
LEFT JOIN wp_postmeta pm2 ON ( pm2.post_id = OIM2.meta_value and pm2.meta_key = '_stock')
Where OIM2.meta_value = 5734 and p.post_status='atum_pending'

Order By ETA ASC
) as q1
) as q2
WHERE q2.QtyInbound_rt > q2.InverseSOH
LIMIT 1

这就是我尝试在WPDB中运行它的方式(我第一次尝试使用WP和WPDB,所以...请别笑

$ProdID = get_the_ID();
echo ("Prod ID:" . $ProdID);
if(!defined('DIEONDBERROR')) define( 'DIEONDBERROR', true );
global $wpdb;


$selectString ="
select ETA as inStockETA, QtyInbound_rt as QI,InverseSOH as ISOI FROM ( Select ETA,(@runtot := @runtot + q1.QtyInbound) AS QtyInbound_rt, (q1.SOH * -1) as InverseSOH 
FROM ( Select pm1.meta_value AS ETA, OIM1.meta_value AS QtyInbound, pm2.meta_value as SOH FROM wp_posts p 
LEFT JOIN wp_postmeta pm1 ON ( pm1.post_id = p.ID AND pm1.meta_key = '_expected_at_location_date') LEFT JOIN wp_atum_order_items OI ON ( OI.order_id = p.id) 
LEFT JOIN wp_atum_order_itemmeta OIM1 ON (OIM1.order_item_id =OI.order_item_id AND OIM1.meta_key='_qty' ) 
LEFT JOIN wp_atum_order_itemmeta OIM2 ON (OIM2.order_item_id =OI.order_item_id AND OIM2.meta_key='_product_id' )
 LEFT JOIN wp_postmeta pm2 ON ( pm2.post_id = OIM2.meta_value and pm2.meta_key = '_stock') 
Where OIM2.meta_value = 5734 and p.post_status='atum_pending' Order By ETA ASC 
) as q1 
) as q2 
WHERE q2.QtyInbound_rt > q2.InverseSOH LIMIT 1 
";

//$selectString = $wpdb->prepare($selectString,$ProdID);
echo("Select String:" . $selectString);

//$nextShip = $wpdb->get_results($selectString);
//$nextShip = $wpdb->get_results($selectString,ARRAY_A);


$wpdb->show_errors();
$nextShip = $wpdb->get_results($selectString);
$wpdb->print_error();
$wpdb->hide_errors();

放入DIEONDBERROR()之后 输出为:

Prod ID:5734Select String: select ETA as inStockETA, QtyInbound_rt as QI,InverseSOH as ISOI FROM ( Select ETA,(@runtot := @runtot + q1.QtyInbound) AS QtyInbound_rt, (q1.SOH * -1) as InverseSOH FROM ( Select pm1.meta_value AS ETA, OIM1.meta_value AS QtyInbound, pm2.meta_value as SOH FROM wp_posts p LEFT JOIN wp_postmeta pm1 ON ( pm1.post_id = p.ID AND pm1.meta_key = '_expected_at_location_date') LEFT JOIN wp_atum_order_items OI ON ( OI.order_id = p.id) LEFT JOIN wp_atum_order_itemmeta OIM1 ON (OIM1.order_item_id =OI.order_item_id AND OIM1.meta_key='_qty' ) LEFT JOIN wp_atum_order_itemmeta OIM2 ON (OIM2.order_item_id =OI.order_item_id AND OIM2.meta_key='_product_id' ) LEFT JOIN wp_postmeta pm2 ON ( pm2.post_id = OIM2.meta_value and pm2.meta_key = '_stock') Where OIM2.meta_value = 5734 and p.post_status='atum_pending' Order By ETA ASC ) as q1 ) as q2 WHERE q2.QtyInbound_rt > q2.InverseSOH LIMIT 1


WordPress database error: [] select ETA as inStockETA, QtyInbound_rt as QI,InverseSOH as ISOI FROM ( Select ETA,(@runtot := @runtot + q1.QtyInbound) AS QtyInbound_rt, (q1.SOH * -1) as InverseSOH FROM ( Select pm1.meta_value AS ETA, OIM1.meta_value AS QtyInbound, pm2.meta_value as SOH FROM wp_posts p LEFT JOIN wp_postmeta pm1 ON ( pm1.post_id = p.ID AND pm1.meta_key = '_expected_at_location_date') LEFT JOIN wp_atum_order_items OI ON ( OI.order_id = p.id) LEFT JOIN wp_atum_order_itemmeta OIM1 ON (OIM1.order_item_id =OI.order_item_id AND OIM1.meta_key='_qty' ) LEFT JOIN wp_atum_order_itemmeta OIM2 ON (OIM2.order_item_id =OI.order_item_id AND OIM2.meta_key='_product_id' ) LEFT JOIN wp_postmeta pm2 ON ( pm2.post_id = OIM2.meta_value and pm2.meta_key = '_stock') Where OIM2.meta_value = 5734 and p.post_status='atum_pending' Order By ETA ASC ) as q1 ) as q2 WHERE q2.QtyInbound_rt > q2.InverseSOH LIMIT 1

2 个答案:

答案 0 :(得分:0)

要了解查询到底发生了什么,请使用以下代码:

$wpdb->show_errors();
$nextShip = $wpdb->get_results($selectString);
$wpdb->print_error();
$wpdb->hide_errors();

让我知道生成的输出。

答案 1 :(得分:0)

顺便说一句,查询中有一些语法错误:

  • 您输入了 JOI $ ,但正确的名称是 JOIN
  • WHERE 子句之前还有一个额外的 LEFT JOIN ,应该不存在。

请检查您分配给 $ selectString 变量的查询。