test - wwq0912/mysql GitHub Wiki
https://stackoverflow.com/questions/25912548/mysql-select-statement-from-multiple-statement#
mysql> select * from student;
+----+----------+-------------+--------------+
| ID | CLASS_ID | STUDENT_AGE | STUDENT_NAME |
+----+----------+-------------+--------------+
| 1 | 4 | 1 | student1 |
| 2 | 1 | 1 | student2 |
| 3 | 1 | 1 | student3 |
| 4 | 3 | 2 | student4 |
| 5 | 1 | 1 | student5 |
| 7 | 2 | 2 | student6 |
+----+----------+-------------+--------------+
1: 按降序排
select * from (
SELECT @student_name:=
CASE
WHEN @class_id=class_id
THEN concat(@student_name, ', ' ,student_name, '=', @class_id)
ELSE concat(student_name, '!=', @class_id)
END
AS student_name, @class_id:=class_id AS class_id
FROM student cross join (select @student_name:='', @class_id:='') init
order by class_id desc
) as temp
;
结果
+-------------------------------------+----------+
| student_name | class_id |
+-------------------------------------+----------+
| student1!=2 | 4 |
| student4!=4 | 3 |
| student6!=3 | 2 |
| student2!=2 | 1 |
| student2!=2, student3=1 | 1 |
| student2!=2, student3=1, student5=1 | 1 |
+-------------------------------------+----------+
2: 按升序排
select * from (
SELECT @student_name:=
CASE
WHEN @class_id=class_id
THEN concat(@student_name, ', ' ,student_name, '=', @class_id)
ELSE concat(student_name, '!=', @class_id)
END
AS student_name, @class_id:=class_id AS class_id
FROM student cross join (select @student_name:='', @class_id:='') init
order by class_id
) as temp
;
结果
+-------------------------------------+----------+
| student_name | class_id |
+-------------------------------------+----------+
| student2!=2 | 1 |
| student2!=2, student3=1 | 1 |
| student2!=2, student3=1, student5=1 | 1 |
| student6!=1 | 2 |
| student4!=2 | 3 |
| student1!=3 | 4 |
+-------------------------------------+----------+
可以看到第一次的@class_id都是2, 所以可以确定的是赋值语句先执行了。。。所以到底是哪条class_id给他赋值的呢??? 我的准备数据 class_id为2的那条按class_id 排序(不论升降)一直都会排在中间 所以否定了按order by之后的数据取值。。。所以大胆猜想 应该是student表的最后一条数据的class_id赋值给他了
解决方案2: 将@class_id:=class_id AS class_id 改成 @class_id:=class_id AS class_id_result 就可以正常work了 不会有','
一般的order by是在select之后 但是这种情况下为了取出正确的数据所以必须先执行order by