2010-05-14 27 views
9

点击表:MySQL查询获得唯一值的计数?

hid | lid | IP 
1 | 1 | 123.123.123.123 
2 | 1 | 123.123.123.123 
3 | 2 | 123.123.123.123 
4 | 2 | 123.123.123.123 
5 | 2 | 123.123.123.124 
6 | 2 | 123.123.123.124 
7 | 3 | 123.123.123.124 
8 | 3 | 123.123.123.124 
9 | 3 | 123.123.123.124 

正如你所看到的,下面是各种盖的独特点击:

lid 1: 1 unique hit 
lid 2: 2 unique hits 
lid 3: 1 unique hit 

因此,基本上,我需要一个查询,将返回以下内容:

lid | uhits | 
1 | 1  | 
2 | 2  | 
3 | 1  | 

任何人都知道如何得到它?

回答

19
Select lid, count(distinct IP) as uhits 
from hits 
group by lid 
+1

我通过用4个空格缩进每行来重新格式化您的代码。请参阅编辑屏幕右侧的格式帮助(+1正确答案) – lexu 2010-05-14 06:54:53

+0

+1以获得良好的答案(并且您也击败了我)。原谅我的编辑,但我冒昧删除一个额外的(不平衡的)左括号。 – 2010-05-14 06:57:35

-2

您可以通过需要在使用组:

SELECT lid, count(*) 
    FROM Table 
    GROUP BY lid 
+2

这将返回命中总数,而不是唯一命中。 – 2010-05-14 06:50:57

6

,直到你开始进入真正复杂的查询,SQL制成,所以它读取很喜欢自然语句。因此,首先,如果您可以准确地描述您想要查询的内容,那么您已经有一半的人编写了SQL。

在这种情况下,你能描述像你的问题:

获得lid,并从我的表中的每个lid的独特IP合计数。

唯一剩下的就是使用SQL关键字来翻译这个。其中重要的是在这里:

  • 得到 - >SELECT
  • 计数 - >COUNT
  • 独特 - >DISTINCT
  • aggregate..for各<场> - >SELECT <aggregate function>..GROUP BY <field>

所以,你的句子以上开始看起来像:

SELECTlidDISTINCTIPFROM我的表GROUP BYlid的总COUNT

删除不必要的话,清除它使用SQL语法离开最终查询:

SELECT hits.lid, COUNT(DISTINCT hits.IP) AS uhits 
FROM hits 
GROUP BY hits.lid 
+0

+1:首先用正确的格式提交答案,且没有任何错误。 – 2010-05-14 07:00:29

1
SELECT lid, COUNT(DISTINCT IP) 
FROM hits 
GROUP BY lid