我有两个表:orders
和order_items
。 Orders
有很多order_items
。它可能是order_items
这样的一些:
| id | order_id | product_id |
| 1 | 5 | 7 |
| 2 | 5 | 8 |
当我仅针对order
使用params进行查询,并且使用GROUP BY
进行查询时,我的预期工作如下:
SELECT `orders`.* FROM `orders`
INNER JOIN order_items AS bonus_items
ON (bonus_items.order_id = orders.id)
WHERE
(DATE(DATE_ADD(orders.created_at, INTERVAL 4 HOUR)) >= '2013-12-02'
AND DATE(DATE_ADD(orders.created_at, INTERVAL 4 HOUR)) <= '2013-12-02'
AND orders.status = 'payed')
GROUP BY bonus_items.order_id HAVING count(*) = 1
此查询查找订单,其中包含一个order_items(一个带有order_id的记录)。
但是,当我添加条件order_items
GROUP BY
和HAVING
无法正常工作时,我的订单会有不同的order_items,例如:
SELECT `orders`.*
FROM `orders`
INNER JOIN order_items AS bonus_items ON (bonus_items.order_id = orders.id)
WHERE (DATE(DATE_ADD(orders.created_at, INTERVAL 4 HOUR)) >= '2013-12-02'
AND DATE(DATE_ADD(orders.created_at, INTERVAL 4 HOUR)) <= '2013-12-02'
AND orders.status = 'payed') AND (bonus_items.user_id = 0))
GROUP BY bonus_items.order_id
HAVING count(*) = 1
为什么我不能使用连接表的条件?
答案 0 :(得分:0)
第二个查询为您提供了只有一个项目给用户0的所有订单。当然,这样的订单可以为其他用户提供额外的项目。
我认为你真正想要的是进一步限制你的第一个查询的结果,例如只获得用户0的一项订单。你可以通过扩展你的HAVING子句来实现这个目的:
SELECT orders.*
FROM orders
INNER JOIN order_items AS bonus_items ON (bonus_items.order_id = orders.id)
WHERE DATE(DATE_ADD(orders.created_at, INTERVAL 4 HOUR)) >= '2013-12-02'
AND DATE(DATE_ADD(orders.created_at, INTERVAL 4 HOUR)) <= '2013-12-02'
AND orders.status = 'payed'
GROUP BY orders.id
HAVING count(*) = 1 and MIN(bonus_items.user_id) = 0;