SQL统计一个列中不同值的数量,并且根据这个数量的排序做一些额外的处理

假设有这个几个表:

userex:

servers:

现在我们要统计servers中配置的各种worldID来查找其在userex中已经拥有的user数量,并统计出符合条件的拥有user数量最少的worldID。

首先根据userex中worldID的值来统计已经有数据的worldID的数量:

SELECT WorldID,count(*) num1 FROM userex GROUP BY WorldID ORDER BY num1, WorldID

然后我要根据上一步查找出来的worldID和num联合servers来进一步判断条件,state状态为1:

SELECT servers.WorldID, if(num1, num1, 0) AS num FROM servers LEFT JOIN (SELECT WorldID,count(*) num1 FROM userex
GROUP BY WorldID ORDER BY num1, WorldID) AS t ON servers.WorldID=t.WorldID WHERE servers.State=1

这个时候我们就已经得到了servers中所配置并且状态state为1的worldID在userex中已经有用的数量num,如果我们要选择最少的那个只需要:

SELECT servers.WorldID, if(num1, num1, 0) AS num FROM servers LEFT JOIN (SELECT WorldID,count(*) num1 FROM userex 
GROUP BY WorldID ORDER BY num1, WorldID) AS t ON servers.WorldID=t.WorldID WHERE servers.State=1 
ORDER BY num, WorldID LIMIT 1;
if(num1, num1, 0)

的意思是如果num1为true(num1<>0 and num1<>NULL),则if返回值为num1,否则返回0。也可以用

ifnull(num1, 0)

num1不为NULL则返回num1,否则返回0。

猜你喜欢

转载自blog.csdn.net/suhiymof/article/details/81221286