2011-08-15 131 views
1

我有一个表是这样的:MySQL的统计重复行

​​

和一个里面有一些数据:

jobid, orderid 
1245, 6767 
1235, 9058 
6783, 6767 
4991, 6767 
9512, 9058 
5123, 1234 

现在我想下面的输出:

jobid, orderid, orderid(total) 
1245, 6767, 3 
1235, 9058, 2 
6783, 6767, 3 
4991, 6767, 3 
9512, 9058, 2 
5123, 1234, 1 

现在, COUNT()不按我想要的方式工作,我可能需要一些组,但我不知道如何。

在此先感谢。

回答

2

为什么做这种方式?你会做很多冗余计数,并给你的服务器施加很多不必要的压力。我将与两个查询做到这一点:

SELECT jobid, orderid FROM my_table 

获得完整的列表,然后:

SELECT orderid, COUNT(*) FROM my_table GROUP BY orderid 

以获得每个订单ID总数。然后将这两个结果合并到您的应用程序中这将比你的解决方案快得多。

+0

不必要的压力不是我要使用的词。数据库将只是发送一个简单的整数列(有少量或多个重复项)。在这个观点中,你的方法会在应用程序中施加“不必要的压力”来结合结果(需要进行一些排序或哈希)。 –

+0

@ypercube我不知道OP使用哪种语言,但在PHP中,我会用第二个查询中的$ orderid => $ count'键/值对填充一个$ count数组,并在迭代第一个查询的结果时我会从该数组中获得每行的计数'$ count [$ orderid]'在应用程序端增加很少的压力。 – nobody

+0

我同意。另一种方法也一样,对db的压力不大。结果转移只有一些冗余。 –

5

它看起来像你想要得到的行看起来像jobid, orderid, number of times that orderid appears。对于这一点,你可以使用子查询:

SELECT jobid, orderid, 
     (SELECT COUNT(*) FROM 
     MY_TABLE INR 
      WHERE INR.orderid = OTR.orderid) as "orderid(total)" 
FROM MY_TABLE OTR 
+0

与Tim的解决方案相比,这是SQL引擎的更多工作。 – dtbarne

+0

@dtbarne它看起来像OP所要求的。 – cwallenpoole

+0

我认为你的SQL语句不正确,因为当我用我的表取代MY_TABLE时,出现错误。 INNER看起来不合适(和外部),但当我删除它们时,我得到所有行的总数,而不是我所需要的。 – Devator

2
SELECT jobid, orderid, count(orderid) 
FROM sometable 
GROUP BY orderid, jobid 
+0

也不管用,因为count(orderid)总是给我“1”。 – Devator

+0

此查询不正确。它不会计算所有出现的相同“orderid”。 –

0
select jobid, orderid, count(*) from table group by orderid; 
+0

不起作用,输出不正确。 – Devator

2
SELECT t.jobid 
    , t.orderid 
    , grp.orderid_total 
FROM 
    tableX AS t 
    JOIN 
    (SELECT orderid 
      , COUNT(*) AS orderid_total 
     FROM tableX 
     GROUP BY orderid 
    ) AS grp 
     ON grp.orderid = t.orderid