mysql与group by和inner join的错误行为

时间:2014-05-19 14:11:16

标签: mysql sql join

我有两个表:ordersorder_itemsOrders有很多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 BYHAVING无法正常工作时,我的订单会有不同的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

为什么我不能使用连接表的条件?

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;