题目描述: 名为user的表结构有user_id(varchar),user_name(varchar)两个属性,理解以下SQL语句并用代码实现其原理:
SELECT COUNT(user_name)
AS count
FROM(
SELECT user_name
FROM user a
GROUP BY user_name
HAVING COUNT(DISTINCT user_id)>=2
)b;
用例输入: 一个数字表示插入的数据总数n,接下来n行输入为user_id与user_name,中间用空格隔开,如:
3
001 大娃
002 二娃
003 三娃
期望输出: 0
题意解析: 解题关键点在于对SQL语句的理解,几个难点:
COUNT(user_name)——返回user_name列的数目;
GROUP BY——相同的user_name值为一组;
HAVING——与GROUP BY一起使用,作为分组后的条件查询语句;
DISTINCT user_id——对user_id去重处理;
原题给的用例太过于简单,我们可以把数据稍微添加一点:
然后先执行SELECT user_name FROM user a GROUP BY user_name HAVING COUNT(DISTINCT user_id)>=2
那么很显然最后的结果就是
整个SQL语句的意思就是查找重名用户的个数,这里我是使用JAVA语言实现的,主要使用了Hashmap,以user_name为key,人数为value,这样让逻辑简化了,带来的弊端就是如果输入了相同的user_id值无法实现SQL语句里的DISTINCT功能,不过这次题干里保证了输入合法,就偷了一个懒。这样存储的方便之处就是直接用value存储同名人数,只需遍历一次map就可以直接得到结果。
代码实现:
import java.util.*;
public class Test1 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int index = sc.nextInt();
HashMap<String, Integer> map = new HashMap<String, Integer>();
while(index-- > 0) {
String no = sc.next();
String name = sc.next();
if(!map.containsKey(name)) {
map.put(name, 1);
}else {
map.put(name, map.get(name)+1);
}
}
int sum = 0;
Iterator iterator = map.keySet().iterator();
while(iterator.hasNext()) {
String key = (String) iterator.next();
int value = map.get(key);
if(value >= 2) {
sum++;
}
}
System.out.println(sum);
}
}