MySQL 多行转多列

mysql 行变列(多行变成一行/多行合并成一行/多行合并成多列/合并行),我觉得这都是一个意思

数据库结构如图:

而我想让同一个人的不同成绩变成此人在这一行不同列上显示出来,此时分为2中展现:

第一种展现如图—-【多行变一列】(合并后的数据在同一列上):

sql如下:

select name ,group_concat(sore Separator ';') as score from stu group by name

 

第二种展现如图—-【多行变多列】(合并后的数据在不同列上):

sql如下:

SELECT name ,
MAX(CASE type WHEN '数学' THEN score ELSE 0 END ) math,
MAX(CASE type WHEN '英语' THEN score ELSE 0 END ) English ,
MAX(CASE type WHEN '语文' THEN score ELSE 0 END ) Chinese
FROM stu
GROUP BY name

 

当然,在第一种情况中(显示在一列),也有些其他的类似形式:

形式一:

sql如下:

 

select name ,group_concat(type,'分数为:',score Separator '; ') as score from stu group by name

 

呵呵,当然 如果你很熟悉group_concat和concat的用法,你也做出如下形式:

其sql如下:

select name ,concat(name ,'的分数为[',group_concat(type,'分数为:',score  Separator '; '),']') as score from stu group by name

 

原文
http://m.blog.csdn.net/article/details?id=50231435

MySQL 根据指定顺序排列

 

MySQL可以根据数字或者文字进行 DESC 或者 ASC 的排列,但是有时候我们储存的数据不一定就按照这个方式存。比如,星期,月份,如果是存数字可以还好,但是存文字方式就会与我们的预想有出入。

可以用 FIELD() 函数进行排序,代码如下:

select * , t2.type as timeType
from 
ims_rooit_class_data as t1
LEFT JOIN
ims_rooit_class_timelist as t2
on t1.data = t2.timeid
LEFT JOIN 
ims_rooit_class_records as t3
on t1.reid = t3.reid
WHERE
t1.type = 'timerange'
ORDER BY
timeType asc,
FIELD(t2.weekday,'Monday','Tuesday','Wednesday','Thursday','Friday','Saturday','Sunday');

 

同一数据源,用field的时间和不用field的时间,差别不大
images

images

 

MySQL 通过GROUP_CONCAT将多列合并成一行(一)

先交代一下背景,一共有 2 张表,分别是

ims_rooit_class_fields 字段表

CREATE TABLE `ims_rooit_class_fields` (
  `fieldid` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '字段id',
  `formid` int(11) NOT NULL COMMENT '表单id',
  `title` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '字段名',
  `type` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '字段类型',
  `required` tinyint(4) NOT NULL DEFAULT '0' COMMENT '是否必须',
  `value` text COLLATE utf8mb4_unicode_ci COMMENT '字段赋值',
  `displayorder` int(11) NOT NULL DEFAULT '100' COMMENT '展示顺序',
  `created_at` datetime DEFAULT NULL COMMENT '创建日期',
  `updated_at` datetime DEFAULT NULL COMMENT '更新日期',
  `deleted_at` datetime DEFAULT NULL COMMENT '删除日期',
  PRIMARY KEY (`fieldid`)
) ENGINE=InnoDB AUTO_INCREMENT=126 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

ims_rooit_class_data 用户填写数据表

CREATE TABLE `ims_rooit_class_data` (
  `dataid` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '数据id',
  `formid` int(11) NOT NULL COMMENT '表单id',
  `reid` int(11) NOT NULL COMMENT '记录id',
  `fieldid` int(11) NOT NULL COMMENT '字段id',
  `type` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '字段类型',
  `data` varchar(500) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '字段内容',
  `created_at` datetime DEFAULT NULL COMMENT '创建日期',
  `updated_at` datetime DEFAULT NULL COMMENT '更新日期',
  `deleted_at` datetime DEFAULT NULL COMMENT '删除日期',
  PRIMARY KEY (`dataid`)
) ENGINE=InnoDB AUTO_INCREMENT=15 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

 

字段表中储存了表单需要填写的字段内容,姓名,手机号等

images

 

 

数据表保存用户提交的数据:

images

通常情况下用 多表联查的方式查询用户填写的记录:

/*字段表联合结果表*/
SELECT
  t_data.reid AS reid,
  t_data.`data`,
  t_data.type,
  t_field.title AS title,
  t_field.formid AS formid 
FROM
  ims_rooit_class_data AS t_data
  LEFT JOIN ims_rooit_class_fields AS t_field ON t_data.fieldid = t_field.fieldid 
WHERE
  t_field.type != 'timerange' 

images

 

但这样还需要用程序去遍历所有数据,提取出对应的结果

 

解决这个方式,可以用 GROUP_CONCAT 的方式合并列为一行

SELECT
    any_value(formid),
    reid,
    /*把所有的列合并到一行,通过 逗号 分割*/
    GROUP_CONCAT( DATA ) AS newdata
  FROM
    (
    /*字段表联合结果表*/
    SELECT
      t_data.reid AS reid,
      t_data.`data`,
      t_data.type,
      t_field.title AS title,
      t_field.formid AS formid 
    FROM
      ims_rooit_class_data AS t_data
      LEFT JOIN ims_rooit_class_fields AS t_field ON t_data.fieldid = t_field.fieldid 
    WHERE
      t_field.type != 'timerange' 
    ) AS t_join 
  GROUP BY
  reid

images

在数据查看上会更加直观,不用借助别的语言二次更改

 

另外,在测试的时候,第二行 any_value(formid) 本来是 formid 的,但是服务器上用的是 MySQL 5.7, 提交后报错

Error Code: 1055. Expression #3 of SELECT list is not in GROUP BY clause and contains nonaggregated column '×××' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

网上找了一下,改成了any_value 函数,问题解决

MySQL获取选课情况

SELECT
  * 
FROM
  (
  SELECT
    t1.DATA AS timeid,
    t2.type AS timeType,
    t2.weekday AS weekday,
    t2.`start`,
    t2.
  END,
  t3.reid,
  t3.userid AS userid 
FROM
  ims_rooit_class_data AS t1
  LEFT JOIN ims_rooit_class_timelist AS t2 ON t1.DATA = t2.timeid
  LEFT JOIN ims_rooit_class_records AS t3 ON t1.reid = t3.reid 
WHERE
  t1.type = 'timerange' 
  AND t1.formid = '1' 
ORDER BY
  timeType ASC,
  FIELD(
    t2.weekday,
    'Monday',
    'Tuesday',
    'Wednesday',
    'Thursday',
    'Friday',
    'Saturday',
    'Sunday' 
  ),
  t2.`start` 
  ) AS t_res1
  LEFT JOIN (
  SELECT
    reid,
    SUBSTRING_INDEX( newdata, ',', 1 ) AS f1,
    SUBSTRING_INDEX(
      SUBSTRING_INDEX( newdata, ',', 2 ),
      ',',- 1 
    ) AS f2,
    SUBSTRING_INDEX(
      SUBSTRING_INDEX( newdata, ',', 3 ),
      ',',- 1 
    ) AS f3 
  FROM
    (
    SELECT
      formid,
      reid,
      GROUP_CONCAT( DATA ) AS newdata 
    FROM
      (
      SELECT
        t_data.reid AS reid,
        t_data.`data`,
        t_data.type,
        t_field.title AS title,
        t_field.formid AS formid 
      FROM
        ims_rooit_class_data AS t_data
        LEFT JOIN ims_rooit_class_fields AS t_field ON t_data.fieldid = t_field.fieldid 
      WHERE
        t_field.type != 'timerange' 
        AND t_field.formid = '1' 
      ) AS t_join 
    GROUP BY
      reid 
    ) AS t_join2 
  ) AS t_res2 ON t_res1.reid = t_res2.reid

 

网站备案成功

天津域名备案的速度还是挺快的,提交上去一周就下来了,阿里云还补贴了一周的服务器使用时间。然后去阿里后台申请了ssl证书,以后就用rooit.com 了,有空就跑上来随便写写东西。唉😔,是不是人老了都会这样

 

images

Centos7.8 Yum安装 LNMP+Redis 过程

一、安装前准备

1.1 关闭 firewall:

systemctl stop firewalld.service #停止firewall
systemctl disable firewalld.service #禁止firewall开机启动
 

1.2 关闭 SELINUX

vi /etc/selinux/config
#SELINUX=enforcing #注释掉
SELINUX=disabled #增加
:wq! #保存退出
setenforce 0 #使配置立即生效

1.3 更新 yum 源

yum update
 

1.4 安装需要的软件包

yum-util 提供yum-config-manager功能
yum install -y yum-utils
yum install -y epel-release
 

1.5 加入新 repo源

rpm -ivh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
 

二、 安装 nginx

2.1 检查可用的 package

yum list --enablerepo=remi | grep nginx
![](image.png)
如果需要添加最新的 nginx 源
cd /etc/yum.repos.d

vim nginx.repo

nginx.repo

[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=0
enabled=1

wq:

2.2 安装

yum -y install nginx

2.3 启动nginx

systemctl start nginx.service #启动nginx
systemctl stop nginx.service #停止
systemctl restart nginx.service #重启
systemctl enable nginx.service #设置开机启动
 

三、安装 PHP

3.1 添加 PHP 源

rpm -ivh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm

3.2 检查可用的 package

yum list --enablerepo=remi | grep php

3.3 安装 PHP 及组件

yum -y install php72-php php72-php-fpm php72-php-bcmath php72-php-gd php72-php-mbstring php72-php-mysql php72-php-pdo php72-php-mysqlnd php72-php-opcache php72-php-pecl-memcache php72-php-pecl-memcached php72-php-pecl-mcrypt php72-php-pecl-mysql php72-php-pecl-redis5 php72-php-json php72-php-pecl-swoole4 php72-php-pecl-zip php72-php-xml php72-php-opcache php72-php-pecl-apcu php72-php-pecl-jsond php72-php-gmp php72-php-process php72-php-pecl-imagick php72-php-devel php72-php-common php72-php-intl php72-php-pecl-jsond-devel php72-php-pear php72-php-pecl-crypto

3.4 设置软链

ln -s /usr/bin/php72 /usr/bin/php
ln -s /usr/bin/php72-cgi /usr/bin/php-cgi
ln -s /usr/bin/php72-phar /usr/bin/php-phar
ln -s /usr/bin/php72-pear /usr/bin/php-pear
ln -s /usr/lib/systemd/system/php72-php-fpm.service /usr/lib/systemd/system/php-fpm.service

3.5 重载damon-reload

systemctl daemon-reload

3.6 启动 PHP-FPM

systemctl start php-fpm.service
systemctl enable php-fpm.service
 

四、安装 Redis

4.1 检查可用 package

yum list --enablerepo=remi | grep redis
![](image1.png)
![](A501481BB3514F678536AFC5F037C357)

4.2 安装 redis

yum -y install redis
 

4.3 启动 并设置成开机启动

systemctl start redis.service
systemctl enable redis.service
 

重开博客,Hello world!

在大学的时候弄过博客,后来因为迁移服务器什么的就把服务器关掉了。很多想法都保存到了有道云笔记上,虽然那样很好,但是不方便分享出来。最近想了想,还是重新弄个博客吧,把创业以来的感悟还有技术方面的收获都记录一下,不为博取任何人关注,权当是记录。

几个月前本来想抢注另一个域名 v138.com 当做公司的短网址域名,只是后来价格越来越高就放弃了。意外发现 dropcatch 上也有 rooit.com 竞价,就花了底价买下来了。现在域名正在备案中,备案过了后就把tancou.com 换成rooit.com。既然拿到了这个域名,也顺便把英文名改成了 Rooit, 也许没有太多含义,不过随便咯,感觉挺特别的。

期待与各位朋友交流,微信/QQ: 14451981

images

 

请我喝杯咖啡吧~

支付宝
微信