我试图找出运行此查询的最佳方法。我基本上需要返回一个“登录”字段列表(登录字段基本上是客户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的记录将是准确 - 问题是我不知道如何在这个结果集上做一个小组
答案 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进行分组,然后仅显示那些仅在那里显示的登录信息,因此只有那些仅在一天内购物的用户。