【问题标题】:Wrong behavior of mysql with group by and inner joinmysql与group by和inner join的错误行为
【发布时间】:2014-05-19 14:11:16
【问题描述】:

我有两张桌子:ordersorder_itemsOrders 有很多 order_items。可能是这样的order_items

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

当我只为order 使用参数进行查询,并使用拥有进行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 添加条件时,我的订单数量不同,例如:

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

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

【问题讨论】:

  • id 似乎没有任何作用。建议你扔掉它。
  • 您能否将sqlfiddle.com 中的表格和一些示例数据以及所需的输出添加到问题中?
  • 不,我有真正的数据库,这对我有什么帮助?
  • @IgorBiryukov 如果您准备了问题的示例版本,我们会更容易为您提供帮助。
  • @IgorBiryukov - 使用 SQL Fiddle 通过帮助我们来帮助您。如果你给我们一个具体的例子来使用它真的很有帮助,而不是一切都是概念性的。

标签: mysql sql join


【解决方案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;

【讨论】:

  • 它与我想要的有些不同。我想要Orders 只有一个bonus_item 并且条件为bonus_item bonus_items.user_id = 0
  • 我不明白其中的区别。我的查询选择了所有只有一件商品的订单。其中它会选择其中一项的用户 ID 为 0 的那些。这与您所说的有什么不同?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-12
  • 1970-01-01
  • 1970-01-01
  • 2021-04-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-19
相关资源
最近更新 更多