1

このクエリを使用して、昨日のすべての売上を取得します。これをどこかにエクスポートします。キャンセル、支払い保留、処理中
などが多いので、完了したものだけをエクスポートしようと思いました。

しかし、どういうわけか 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

';
4

3 に答える 3

3

次のようなクエリを作成すると、災害に備えることができます。

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"

....そこに見えますか?結合条件が欠落しているため、代わりにデカルト積が選択されます。欠落している結合条件を追加すると、結果が期待どおりになるはずです。

于 2013-01-24T16:41:05.593 に答える
1

私はあなたの場所の問題は、列の値が同時に2つの異なる値を持つことを期待していることだと思います。おそらく、その列にこれらの値のいずれかを持たせたいでしょう。

これはうまくいくかもしれません

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"
于 2013-01-24T16:38:16.513 に答える
1

FROM句に「sales_order_status」という名前のテーブルがありますが、他のテーブルとどのように結合されているかわかりません。だから私はそれが問題だと思います。JOIN 句の sales_order_status テーブルに関連する部分がありません。

したがって、現在取得しているのは、sales_order_statusテーブルと、sales_flat_order_gridsales_flat_order_item、およびsales_flat_order_paymentを結合して得た結果のテーブルとの間のクロス結合です。したがって、クエリ結果にすべての注文ステータスが表示されます。

于 2013-01-24T16:36:14.037 に答える