MySql分组

时间:2012-05-29 20:24:16

标签: mysql x-cart

我试图找出运行此查询的最佳方法。我基本上需要返回一个“登录”字段列表(登录字段基本上是客户ID /密钥),这些客户只在我们的系统中下了一个订单。

我们系统的一些背景......

客户在同一天下达的多个订单是一个订单的等价物。原因是我们有多个供应商,只要有人订购我们的购物车系统,就会将该单个订单拆分为多个订单 - 按订单每个独立供应商订购一个订单。

这是我到目前为止提出的基本mysql查询..

SELECT  
xcart_orders.login,
COUNT(xcart_orders.login) as c1,
FROM_UNIXTIME(xcart_orders.date, '%Y-%m-%d') as d1

 FROM
xcart_orders

 WHERE
INSTR(xcart_orders.email, "marketplace") <= 0

 GROUP BY
xcart_orders.login,
FROM_UNIXTIME(xcart_orders.date, '%Y-%m-%d')

ORDER BY
xcart_orders.login
ASC

以下是返回数据的示例...

login       c1      d1
01crouse    1   2007-11-30
022336010   2   2009-06-24
022336010   1   2009-08-28
02emzach    1   2011-08-25
02emzach    1   2011-10-18

这给我一个很好的客户列表,每个日期的唯一订单数

问题是 - 现在我需要对此结果集进行分组,并且仅返回在此结果集中具有1个唯一记录的客户 - 我不太确定如何执行此操作

所以如果你看到上面的示例结果集 - 我需要从登录列表中返回01crouse - 因为登录只有1条记录,1个订单,其他的有多个订单。我希望这是有道理的 - 如果您有任何问题,请告诉我

使用

的重要说明

我被推荐使用:

HAVING c1 = 1

不幸的是,不能工作 - 原因是因为c1可以大于1,因为情况是真的。请记住,它在结果中给我一个PER日的订单数量 - 因此 - 如果有人在同一天按顺序放置1个订单和3个供应商,那么它将导致该一天的3个订单 - 但是 - 这是一个订单他们放置 - 使用HAVING

排除这些类型的人

这就是为什么我需要对结果集进行分组然后计数 - 例如我将通过登录字段对结果集执行另一个组然后对登录进行计数 - 任何在此计数上返回1的记录将是准确 - 问题是我不知道如何在这个结果集上做一个小组

2 个答案:

答案 0 :(得分:1)

MySQL's HAVING clause。您已经按登录进行分组,因此您应该只需添加HAVING COUNT(login) = 1

即可

如果查询变得更复杂,您可以始终将此查询嵌套在另一个组中并执行另一个组,但不能保证在执行此操作时获得良好的性能。

答案 1 :(得分:1)

您可以使用另一个SELECT(原始SELECT之外),如下所示:

SELECT login, c1, d1, count(login) as c2 
FROM (...YOUR SELECT...) as orig
GROUP BY login
HAVING c2 = 1

这会根据登录信息对您的原始SELECT进行分组,然后仅显示那些仅在那里显示的登录信息,因此只有那些仅在一天内购物的用户。