【问题标题】:mysql ignores where statementmysql忽略where语句
【发布时间】:2013-01-24 16:29:22
【问题描述】:

我使用此查询获取昨天的所有销售额。将其导出到某个地方。
由于有很多已取消、待付款、正在处理等,我想只导出已完成的。

但不知何故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

';

【问题讨论】:

  • 这应该可以正常工作 - 你确定你的问题不在其他地方吗?您是否尝试过将' 换成" 和相反?
  • 不,我试试看
  • 看不到问题的原因,但您似乎确实有一个无意的交叉连接(没有为连接到sakes_order_status 指定 JOIN 条件)
  • @h2ooooooo 没有,不幸的是没有。但是如果是这样就很俗气了^^
  • 提示:您可以使用from tablename as something,然后使用something 引用该表。使查询更整洁。

标签: php mysql debian magento-1.7


【解决方案1】:

当您编写这样的查询时,您正在为自己准备灾难:

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"

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

【讨论】:

  • 感谢杰克的建议。从现在开始我要使用 join。
【解决方案2】:

我认为您 where 的问题是您希望列值同时具有两个不同的值,也许您希望该列具有这些值中的任何一个

这可能有效

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"

【讨论】:

  • 我认为我们 2 的思维方式有点相似,但这不是正确的方式。
  • @derty 你是对的,我完全错过了他使用 Joins 的事实:)
【解决方案3】:

FROM 子句中有一个名为“sales_order_status”的表,但我看不出它是如何与其他表连接的。所以我认为这就是问题所在。您在 JOIN 子句中缺少与 sales_order_status 表相关的部分。

因此,您目前得到的是 sales_order_status 表和通过加入 sales_flat_order_gridsales_flat_order_item 得到的结果表之间的交叉联接 sales_flat_order_payment。因此,您可以在查询结果中看到所有订单状态。

【讨论】:

    猜你喜欢
    • 2015-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-24
    • 1970-01-01
    • 1970-01-01
    • 2016-01-21
    • 2012-12-29
    相关资源
    最近更新 更多