MySql 对组进行分组

  • 本文关键字:MySql mysql x-cart
  • 更新时间 :
  • 英文 :


我正在尝试找出运行此查询的最佳方法。我基本上需要返回仅在我们系统中下过一个订单的客户的"登录"字段列表(登录字段基本上是客户 ID/密钥)。

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

客户在同一天下达的多个订单等于一个订单。原因是我们有多个供应商,每当有人订购我们的购物车系统时,都会将该单个订单拆分为多个订单 - 该订单中每个唯一供应商 1 个订单。

这是我到目前为止想出的基本 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 个订单,而其他登录名有多个订单。我希望这是有道理的 - 如果您有任何问题,请告诉我

有关使用 Have 的重要说明

我被建议使用:

HAVING c1 = 1

不幸的是,拥有将不起作用 - 原因是因为 c1 可以大于 1 才能使情况为真。请记住,它在结果中每天给我一个订单计数 - 因此 - 如果有人在同一天向该订单中的 3 个供应商下 1 个订单,这将导致当天的 3 个订单 - 但是 - 这是他们下的一个订单 - 这些类型的人将被排除在外

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

您可以使用另一个 SELECT(在原始 SELECT 之外)执行此操作,如下所示:

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

这将按登录名对您的原始 SELECT 进行分组,然后仅显示那些仅在此处显示一次的登录信息,因此仅显示那些仅在一天内购物的用户。

参见MySQL的HAVE子句。您已经按登录名分组,因此您应该能够简单地添加HAVING COUNT(login) = 1

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

相关内容

  • 没有找到相关文章

最新更新