编写一个唯一计数条目的MySQL查询

时间:2013-06-03 07:47:52

标签: mysql

这是我的表结构 -

TABLE : T_LOG

---------------------------------------------------
 |    ID    |   AREA     |  USER_ID |   DATE
---------------------------------------------------
 |     1    |   AREA1    |     5    |  2000-05-17
---------------------------------------------------
 |     2    |   AREA1    |     5    |  2002-12-12
---------------------------------------------------
 |     3    |   AREA2    |     5    |  2003-02-19
---------------------------------------------------
 |     4    |   AREA1    |     5    |  2006-05-22
---------------------------------------------------
 |     5    |   AREA2    |     5    |  2006-07-29
---------------------------------------------------
 |     6    |   AREA3    |     5    |  2009-05-07
---------------------------------------------------

在此表中,USER_ID 5已在多个AREA处与多个DATE进行了对比。 我想选择到目前为止特定AREA已经过多少(唯一)USER_ID

以下查询

SELECT COUNT(*) FROM T_LOG WHERE USER_ID = 5 GROUP BY 'AREA'

返回6,如6个条目。但我希望它返回3,就像3个区域一样(AREA1AREA2AREA3

如何更正此查询?

3 个答案:

答案 0 :(得分:2)

您可以使用count(distinct):

SELECT COUNT(DISTINCT AREA) FROM T_LOG WHERE USER_ID = 5

答案 1 :(得分:1)

您的实际问题是您已将Area列指定为GROUP BY子句中的值(即GROUP BY 'Area')。哪个应该没有单引号。 (即GROUP BY Area

请尝试此查询:

SELECT COUNT(*) FROM T_LOG WHERE USER_ID = 5 GROUP BY AREA

请参阅this SQLFiddle

或者,您可以直接使用其他答案中已提及的COUNT(DISTINCT Area)(更优选哪一个)。

答案 2 :(得分:0)

SELECT COUNT(DISTINCT AREA), USER_ID FROM T_LOG WHERE USER_ID = 5