如何通过SQL组合近乎相同的项目?

Tin*_*ool 0 mysql sql

我在数据库中有一些数据:

id user 
1 zhangsan 
2 zhangsan 
3 zhangsan 
4 lisi 
5 lisi 
6 lisi 
7 zhangsan 
8 zhangsan 
Run Code Online (Sandbox Code Playgroud)

我想保持订单,并结合近乎相同的用户项目,该怎么做?当我使用shell脚本时,我会(文件测试中的数据):

cat test|cut -d " " -f2|uniq -c 
Run Code Online (Sandbox Code Playgroud)

这将得到如下结果:

   3 zhangsan 
   3 lisi 
   2 zhangsan 
Run Code Online (Sandbox Code Playgroud)

但是如何使用sql呢?

mat*_*fee 5

如果你试试:

SET @name:='',@num:=0;

SELECT id,
       @num:= if(@name = user, @num, @num + 1) as number,
       @name := user as user
FROM foo
ORDER BY id ASC;
Run Code Online (Sandbox Code Playgroud)

这给出了:

+------+--------+------+
| id   | number | user |
+------+--------+------+
|    1 |      1 | a    |
|    2 |      1 | a    |
|    3 |      1 | a    |
|    4 |      2 | b    |
|    5 |      2 | b    |
|    6 |      2 | b    |
|    7 |      3 | a    |
|    8 |      3 | a    |
+------+--------+------+
Run Code Online (Sandbox Code Playgroud)

那么你可以尝试:

SET @name:='',@num:=0;

SELECT COUNT(*) as count, user
FROM (
SELECT @num:= if(@name = user, @num, @num + 1) as number,
       @name := user as user
FROM foo
ORDER BY id ASC
) x
GROUP BY number;
Run Code Online (Sandbox Code Playgroud)

这使

+-------+------+
| count | user |
+-------+------+
|     3 | a    |
|     3 | b    |
|     2 | a    |
+-------+------+
Run Code Online (Sandbox Code Playgroud)

(我打电话给我的表foo,也只是使用的名称ab因为我懒得写zhangsan,并lisi一遍又一遍).