MySQL部分查询写法

1.根据a列进行分组,然后取b列最新的一条数据,b列是时间类型
使用子查询和GROUP BY

SELECT yt.*  
FROM your_table yt  
INNER JOIN (  
    SELECT a, MAX(b) AS latest_b  
    FROM your_table  
    GROUP BY a  
) AS latest_times ON yt.a = latest_times.a AND yt.b = latest_times.latest_b;

2.查看group_concat返回值的最大长度,默认1024

SHOW VARIABLES LIKE "group_concat_max_len";

2.1修改group_concat返回值的最大长度,永久生效,需要重启
在mysqld下加入

group_concat_max_len = 2048

2.2修改group_concat返回值的最大长度,临时修改,重启失效

SET GLOBAL group_concat_max_len=2048; 
SET SESSION group_concat_max_len=2048; 

3.MySQL + mybatis plus批量插入配置

spring:
  datasource:
    url: jdbc:mysql://ip:3306/demo?useUnicode=true&characterEncoding=utf-8&rewriteBatchedStatements=true&allowMultiQueries=true
    username: root
    password: 'xxx'

不加insert-strategy: ignored会导致批量插入失败

mybatis-plus:
 global-config:
   db-config:
     insert-strategy: ignored

4.有一张表,有四个字段,医院,就诊,处方,是否合理,一个医院有多个就诊,每个就诊有多个处方,每个处方可能合理可能不合理,现在要按医院维度进行统计有多少个就诊合理,如果一个就诊既有合理,又有不合理,那就算不合理,这种三级关联统计的查询需要使用子表来实现,举例

SELECT
    hospital,
    SUM(is_reasonable_visit) AS reasonable_visits_count
FROM (
    SELECT
        hop.hsp_id AS hospital,
        hop.visit,
        CASE
            WHEN SUM(CASE WHEN hopd.is_reasonable = 0 THEN 1 ELSE 0 END) > 0 THEN 0
            ELSE 1
        END AS is_reasonable_visit
    FROM
        his_outpatient_prescription hop
    INNER JOIN his_outpatient_prescription_detail hopd ON hop.prescription_number = hopd.prescription_number
        AND hop.hsp_id = hopd.hsp_id
    GROUP BY
        hop.hsp_id,
        hop.visit
) AS visit_reasonability
GROUP BY
    hospital;

5.查询表名、备注、索引情况

select bbb.table_name,bbb.table_comment,aaa.index_name,aaa.index_clumn from information_schema.`TABLES` bbb
left join (SELECT table_name,index_name,group_concat(column_name) as index_clumn FROM INFORMATION_SCHEMA.STATISTICS WHERE TABLE_SCHEMA = 'ppt_zj'  and index_name != 'PRIMARY'
group by table_name,index_name)  aaa on aaa.table_name = bbb.TABLE_NAME
where bbb.table_schema = 'test' 
<think>嗯,用户问的是MySQL中如何实现列转行,也就是PIVOT的反操作,行转列。首先,我得确认MySQL本身是否支持PIVOT语法。根据我记得,MySQL不像SQL Server那样直接支持PIVOT和UNPIVOT操作。用户提到的参考引用里,引用[1]提到了UNPIVOT语法,但可能是在其他数据库中的用法,比如SQL Server。引用[2]提到了动态行转列,但用户需要的是列转行,也就是UNPIVOT。 接下来,用户可能需要的是将多个列转换为行记录。比如,学生表中的各科成绩列(数学、语文、英语)转换为行,每行显示一个科目的成绩。这时候,通常的方法是使用UNION ALL或者动态SQL。不过,MySQL没有内置的UNPIVOT函数,所以需要手动处理。 首先,静态列转行的话,可以用UNION ALL。例如,每个科目单独SELECT出来,然后合并。这种方法适合已知列名的情况,但如果列很多或者动态变化,就不方便了。 然后是动态SQL方法,用户提到的引用[2]是关于动态行转列,但思路类似。动态生成SQL语句,通过CONCAT拼接列名,然后执行预处理语句。这里需要从information_schema中获取表的列信息,然后构造UNION ALL的语句。 需要注意的是,动态SQL可能会比较复杂,需要处理变量和预处理语句。另外,用户可能需要示例代码,所以应该给出具体的例子,比如学生成绩表的转换。 同时,用户提供的引用[3]中有插入学生数据的例子,包含数学、语文、英语的成绩,这正好可以作为示例数据。所以可以基于这个例子来展示如何将这三个科目的列转换为行。 总结一下,回答应该分两部分:静态列转行使用UNION ALL,动态列转行使用动态SQL。并且给出具体的示例,引用用户提供的例子中的数据。同时,要指出MySQL没有直接的PIVOT语法,需要使用其他方法替代。</think>在MySQL中实现列转行(即行转列或UNPPVOT操作),可以通过以下两种方法实现: ### 一、静态列转行(适用于已知列名) ```sql SELECT stuid, stunm, 'math' AS subject, math AS score FROM Student UNION ALL SELECT stuid, stunm, 'chinese', chinese FROM Student UNION ALL SELECT stuid, stunm, 'english', english FROM Student ORDER BY stuid, subject; ``` *说明:* 此方法手动指定需要转换的列名(math/chinese/english),生成科目-分数对应关系[^3]。 ### 二、动态列转行(适用于未知列名) ```sql SET @sql = NULL; SELECT GROUP_CONCAT(DISTINCT CONCAT('SELECT stuid, stunm, ''', COLUMN_NAME, ''' AS subject, ', COLUMN_NAME, ' AS score FROM Student') ) INTO @sql FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'Student' AND COLUMN_NAME NOT IN ('stuid', 'stunm', 'birthdate', 'gender'); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; ``` *说明:* 通过`INFORMATION_SCHEMA`动态获取列名,自动生成UNION ALL查询语句[^2]。 ### 示例数据转换效果 原始数据格式: | stuid | stunm | math | chinese | english | |-------|-------|-----|---------|---------| | 01 | 赵雷 | 80 | 90 | 99 | 转换后结果: | stuid | stunm | subject | score | |-------|-------|----------|-------| | 01 | 赵雷 | math | 80 | | 01 | 赵雷 | chinese | 90 | | 01 | 赵雷 | english | 99 | ### 对比说明 1. **静态方法**适合固定结构的表,查询效率更高 2. **动态方法**适合列经常变化的场景,但需要执行预处理语句
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值