这是我的表结构 -
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个区域一样(AREA1
,AREA2
,AREA3
)
如何更正此查询?
答案 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
或者,您可以直接使用其他答案中已提及的COUNT(DISTINCT Area)
(更优选哪一个)。
答案 2 :(得分:0)
SELECT COUNT(DISTINCT AREA), USER_ID FROM T_LOG WHERE USER_ID = 5