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 表,所以您毕竟有效地构建了一个 INNER JOIN。

您也可以通过将条件移动到联接来更改它,或者向 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

演示第二个:

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,但我认为第二种使用 ORM 通常更容易实现。

顺便说一句,您按 订购ID,但不使用别名。我不清楚(不是 MySQL)那是 users.ID、orders.ID 还是 deal.ID。

于 2012-11-19T16:32:26.100 回答