我需要什么,不同的或分组的?

时间:2015-06-06 18:15:02

标签: mysql sql

我无法弄清楚我是否需​​要一个独特的或一组的 或者我可能完全离开了。

这是我当前的查询

SELECT * FROM `product_sales`
WHERE `VisitorSessionId` IN
 (
  SELECT `VisitorSessionId` from `product_sales`
  WHERE `ProductId` = 68 AND `SiteId` = 1
 )
AND `SiteId` = 1
ORDER BY id DESC LIMIT 0,200

这将是我用当前查询得到的结果集的一个例子

Id  SiteId  VisitorSessionId    TimeStamp   OrderId ProductId   CustomerId
65655   1   -327    1430798400  30133   84  19262
65654   1   -327    1430798400  30133   84  19262
65653   1   -327    1430798400  30133   68  19262
65652   1   -327    1430798400  30133   68  19262
65333   1   -435    1429848000  29969   68  19211
65332   1   -435    1429848000  29969   68  19211
65331   1   -435    1429848000  29969   90  19211
65330   1   -435    1429848000  29969   90  19211
65100   1   -504    1429329600  29871   5632    12688
65099   1   -504    1429329600  29871   5632    12688

但我想要的是每OrderIdProductId

只有一行

因此,我可以在同一OrderId

中获得同一ProductId但不是同一OrderId的多行

因此,例如,这就是id喜欢获取

Id  SiteId  VisitorSessionId    TimeStamp   OrderId ProductId   CustomerId
65654   1   -327    1430798400  30133   84  19262
65652   1   -327    1430798400  30133   68  19262
65332   1   -435    1429848000  29969   68  19211
65330   1   -435    1429848000  29969   90  19211
65099   1   -504    1429329600  29871   5632    12688

当我使用组时,我只获得每个OrderId

中的第一条记录

如何获得预期结果?

1 个答案:

答案 0 :(得分:2)

在MySQL中,可以使用group by来实现此目的:

SELECT ps.*
FROM `product_sales` ps
WHERE `VisitorSessionId` IN (SELECT `VisitorSessionId` 
                             FROM `product_sales`
                             WHERE `ProductId` = 68 AND `SiteId` = 1
                            ) AND
      `SiteId` = 1
GROUP BY productId, orderId
ORDER BY id DESC
LIMIT 0,200;

但是,这使用MySQL扩展,group by中的列不在group by中。这些来自 indeterminate 行,甚至不保证它们来自同一行(尽管它们将来自与该组匹配的“正确”行)。

也许这满足了你的需要。否则,您将需要更复杂的查询。我可能会建议这种变化:

SELECT ps.orderid, ps.siteid, ps.VisitorSessionId, ps.TimeStamp, ps.OrderId,
       group_concat(ProductId)
FROM `product_sales` ps
WHERE `SiteId` = 1
GROUP BY ps.orderid, ps.siteid, ps.VisitorSessionId, ps.TimeStamp, ps.OrderId
HAVING SUM(`ProductId` = 68 AND `SiteId` = 1) > 0
ORDER BY orderId DESC
LIMIT 0, 200;

每个订单产生一行,满足ProductId = 68 AND SiteId = 1`,产品包含在链接列表中。