MySQL左连接查询与WHERE语句

时间:2011-07-15 12:44:52

标签: php mysql

输出我需要的数据时遇到问题:

$start_of_month = mktime(00, 00, 00, date('m'), 01);
$datestart = date("Y-m-d H:i:s",$start_of_month);

'SELECT
orderheader.ordernumber
, ccilog.sessionid
, ccilog.orderid
, orderheader.userid
, users.emailaddress
, orderheader.webbrandcode
, orderitems.productcode
, orderitems.productname
, orderheader.datecreated
, ccilog.formattedpaymentdate
, orderheader.voucherpromotioncode
, orderheader.vouchercode
, orderheader.itemtotalsell
, orderheader.shippingtotalsell
, orderheader.totalbeforediscount
, orderheader.voucherdiscountvalue
, orderheader.totaldiscount
, orderheader.totalsell
, orderheader.totaltax
, orderheader.total
, orderitems.subtotal
, orderitems.discountvalue
, ccilog.amount 
FROM orderheader 
LEFT JOIN ccilog ON orderheader.id=ccilog.orderid 
LEFT JOIN orderitems ON ccilog.orderid=orderitems.orderid 
LEFT JOIN users ON orderheader.userid=users.id 
WHERE ccilog.formattedpaymentdate > "'.$datestart.'"'

我有一个脚本可以将此查询转换为csv文件。整个脚本很有效,直到我输入where语句,我不希望得到什么。

我有三行包含的日期大于月初日期$ datestart,但出于某种原因,只有2行显示,我只是无法找出原因?

我的日期设置格式为$ datestart(例如2011-07-07 13:31:28),3行的日期相同但时间略有不同,相隔约4分钟。

我被困了,有人可以给我一些建议吗?

由于

编辑:这是数据:

---- Orderheader - 
row1 id:122
row2 id:123 
row3 id:124 

---- ccilog - 
Row1 orderid:122 formattedpaymentdate:2011-07-07 13:23:52
Row2 orderid:123 formattedpaymentdate:2011-07-07 13:28:24 
Row3 orderid:124 formattedpaymentdate:2011-07-07 13:31:28 

我确定该类型是日期类型,但无法确定如何确定。

2 个答案:

答案 0 :(得分:0)

WHERE条件移至ON子句:

LEFT JOIN
        ccilog
ON      ccilog.orderid = orderheader.id
        AND ccilog.formattedpaymentdate > $datestart
在连接之后(逻辑上)评估

WHERE,因此过滤器将应用于NULL生成的LEFT JOIN值,并且条件永远不会成立。

答案 1 :(得分:0)

如果问题确实是您的描述方式,那么我猜您ccilog中符合条件的三行中有一行的orderid没有相应的idorderheader表中(如果你想包含它,你真的需要在这些表之间加一个正确的JOIN,而不是LEFT JOIN ......)

否则我和Quassnoi在一起,因为LEFT JOIN到一个表然后指定WHERE标准,其中该表中的列必须是非NULL,没有多大意义。

真的,我们需要查看您的数据以确切了解发生了什么 - 至少是主要/外键和formattedpaymentdate列,包括所涉及的类型(如果formattedpaymentdate是实际上是日期类型列而不是字符列,例如,这可能会使问题混淆。)