mysql - mysql使用group by和inner join时的错误行为

标签 mysql sql join

我有两个表:ordersorder_itemsOrders 有许多 order_items。可能是一些order_items,如下所示:

| id | order_id | product_id |
|  1 |        5 |          7 |
|  2 |        5 |          8 |

当我仅使用 order 的参数进行查询,并使用having进行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 的订单(一 strip 有 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

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

最佳答案

第二个查询为您提供只有用户 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;

关于mysql - mysql使用group by和inner join时的错误行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23740018/

相关文章:

php - 使用php远程连接到phpmyadmin

java - 将多个字符串数组插入数据库

php - MySQL : check the content change or not

mysql - 具有日期类型的数据透视表

sql - Postgresql:查询以了解值的哪一部分更大/更小

使用联接的 mysql 查询

mysql - SQL 中 JOIN LEFT 后的 CASE

sql - 表左外连接自身 : How does this work?

python - MySQL/Python 抢占式缓存

sql - 是否可以更改Hive中分区表上的列的元数据?