0
                ->and_where_open()
                    ->and_where('orders.status', '=', 'delivered')->or_where('orders.status', '=', 'new')
                ->and_where_close()

これは私が得たものです:

SELECT deals.*, SUM(orders.total_count) AS revenue, SUM(orders.quantity) AS qty
                FROM deals
                LEFT JOIN users ON (users.id = deals.partner_id)
                LEFT JOIN orders ON (orders.deal_id = deals.id)
                WHERE (orders.status = 'delivered' OR orders.status = 'new')
                AND (title LIKE '%cake%'
                        OR title LIKE '%cake%'
                        OR description LIKE '%cake%'
                        )
                AND deals.seller_id = 123
                GROUP BY deals.ID
                ORDER BY ID DESC
                LIMIT 10

これは、注文があり、ステータスが配信済みまたは新規の場合にうまく機能します。

このクエリで、注文がないものも含め、すべての取引を表示したいと思います。

したがって、この deal_id の注文が存在する場合は、SUM() を実行して、orders.status が配信済みか新規かを確認する必要があります。代わりに、このクエリは取引行を除外しますが、代わりにそれを取得したいと考えています。

これはどのように行うことができますか?

4

1 に答える 1

1

LEFT JOINの代わりに使用しましINNER JOINた。これにより、注文がない場合のレコードも提供されます。ただし、WHERE句でordersテーブルも使用するため、結局、効果的にINNERJOINを構築できます。

条件を結合に移動することでこれを変更することも、where句に追加を追加してwhere orders.orderid(または同様の必須フィールド)のレコードも許可することもできますis null

最初のデモンストレーション:

SELECT deals.*, SUM(orders.total_count) AS revenue, SUM(orders.quantity) AS qty
            FROM deals
            LEFT JOIN users ON (users.id = deals.partner_id)
            LEFT JOIN orders ON (orders.deal_id = deals.id) AND
             (orders.status = 'delivered' OR orders.status = 'new')
            WHERE
               (title LIKE '%cake%'
                OR title LIKE '%cake%'
                OR description LIKE '%cake%'
               )
            AND deals.seller_id = 123
            GROUP BY deals.ID
            ORDER BY ID DESC
            LIMIT 10

2番目のデモンストレーション:

SELECT deals.*, SUM(orders.total_count) AS revenue, SUM(orders.quantity) AS qty
            FROM deals
            LEFT JOIN users ON (users.id = deals.partner_id)
            LEFT JOIN orders ON (orders.deal_id = deals.id)
            WHERE (
               orders.ID is null 
               or orders.status = 'delivered' 
               OR orders.status = 'new')
            AND (title LIKE '%cake%'
                    OR title LIKE '%cake%'
                    OR description LIKE '%cake%'
                    )
            AND deals.seller_id = 123
            GROUP BY deals.ID
            ORDER BY ID DESC
            LIMIT 10

どのORMを使用するかはわかりませんが、2番目のORMは一般的にORMを使用して実装する方が簡単だと思います。

ところで、あなたはで注文しますIDが、エイリアスは使用しません。それがusers.ID、orders.ID、deals.IDのいずれであるかは、私にはわかりません(MySQLではありません)。

于 2012-11-19T16:32:26.100 に答える