繁体   English   中英

mysql忽略where语句

[英]mysql ignores where statement

我使用此查询来获取昨天的所有销售额。 将此导出到某个地方。
由于存在许多已取消,待处理的付款,处理等操作,因此我认为仅导出已完成的那些。

但是以某种方式,mysql只是忽略了拳头的限制。 我一直都得到所有的销售。 我写什么都没关系。只需要是昨天使用的状态即可。

$sql = '

SELECT
        sales_flat_order_grid.entity_id,
        sales_flat_order_grid.increment_id AS increment_id,
        sales_flat_order_grid.quote_id AS quote_id,
        sales_flat_order_grid.store_name AS store_name,
        sales_flat_order_grid.created_at AS created_at,
        sales_flat_order_grid.billing_name AS billing_name,
        sales_flat_order_grid.payment_method AS payment_method,
        sales_flat_order_grid.grand_total AS grand_total,
        sales_order_status.label AS status,
        sales_flat_order_item.sku AS sku,
        sales_flat_order_item.name AS name,
        sales_flat_order_item.price_incl_tax AS price_incl_tax,
        sales_flat_order_item.product_options AS product_options,
        sales_flat_order_payment.additional_information AS additional_information

FROM
        sales_flat_order_grid,
        sales_order_status,
        sales_flat_order_item,
        sales_flat_order_payment

WHERE
        sales_flat_order_grid.status = "Complete"
        AND sales_flat_order_grid.entity_id = sales_flat_order_item.order_id
        AND sales_flat_order_grid.entity_id = sales_flat_order_payment.entity_id
        AND sales_flat_order_grid.created_at >= "' . $date . ' 00:00:00"
        AND sales_flat_order_grid.created_at <= "' . $date . ' 23:59:59"

ORDER BY
        sales_flat_order_grid.entity_id DESC

';

当您编写如下查询时,您将为灾难做好准备:

FROM
    sales_flat_order_grid,
    sales_order_status,
    sales_flat_order_item,
    sales_flat_order_payment

WHERE
    sales_flat_order_grid.status = "Complete"
    AND sales_flat_order_grid.entity_id = sales_flat_order_item.order_id
    AND sales_flat_order_grid.entity_id = sales_flat_order_payment.entity_id
    AND sales_flat_order_grid.created_at >= "' . $date . ' 00:00:00"
    AND sales_flat_order_grid.created_at <= "' . $date . ' 23:59:59"

为什么? 因为错过JOIN条件太容易了。

相反,请使用以下语法:

FROM
    sales_flat_order_grid
    INNER JOIN sales_order_status ON ....
    INNER JOIN sales_flat_order_item ON sales_flat_order_grid.entity_id = sales_flat_order_item.order_id
    INNER JOIN sales_flat_order_payment ON sales_flat_order_grid.entity_id = sales_flat_order_payment.entity_id

WHERE
    sales_flat_order_grid.status = "Complete"
    AND sales_flat_order_grid.created_at >= "' . $date . ' 00:00:00"
    AND sales_flat_order_grid.created_at <= "' . $date . ' 23:59:59"

看到....吗? 它缺少连接条件,因此选择了笛卡尔积 添加缺少的加入条件,您的结果应更符合您的期望。

在FROM子句中有一个名为“ sales_order_status”的表,但我看不到它如何与其他表结合在一起。 所以我认为这就是问题所在。 您缺少JOIN子句中与sales_order_status表相关的零件。

因此,当前得到的是通过连接sales_flat_order_gridsales_flat_order_itemsales_flat_order_payment而在sales_order_status表和所得表之间进行交叉 联接 因此,您会在查询结果中看到所有订单状态。

我认为您所在位置的问题是您期望一个列值同时具有两个不同的值,也许您希望该列具有这些值中的一个

这可能有效

WHERE
        sales_flat_order_grid.status = "Complete"
        AND (sales_flat_order_grid.entity_id = sales_flat_order_item.order_id
             OR sales_flat_order_grid.entity_id = sales_flat_order_payment.entity_id)
        AND sales_flat_order_grid.created_at >= "' . $date . ' 00:00:00"
        AND sales_flat_order_grid.created_at <= "' . $date . ' 23:59:59"

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM