分类 Mysql 下的文章

我的个人博客:逐步前行STEP

在mysql应用中常常需要通过别的表的查询结果来更新本表,但很少会本表的查询结果再来更新本表的,下面就看看从本表查询结果更新本表应该怎么做吧。

表classify:

字段属性
idint(11)
namestring(255)

表production:

字段属性
idint(11)
classify_idint(11)

现在表classify中新增pro_cnt字段来统计一个分类下的商品数量:

字段属性
idint(11)
namestring(255)
pro_cntint(11)

新增字段之后,需要初始更新一下pro_cnt的值为当前分类下的商品数量,首先,通过leftjoin查询出每个分类下的商品数

    select count(production.id) pro_cnt from classify 
    left join production on classify.id = production.classify_id

然后将查询结果与classify再做一个连接,并且使用update...set语法做字段你更新:

    update classify inner join 
    (    
        select classify.id, count(production.id) pro_cnt from classify 
        left join production on classify.id = production.classify_id
    ) as tmp
    on using(id)
    set classify.pro_cnt = tmp.pro_cnt

1、如果是使用Eloquent ORM操作数据库的话,在sql查询时可以调用toSql()方法来获取sql:

    App\User::where('name','like','%hezehua%')->toSql();

2、如果是执行原生Sql查询,则不能使用toSql()方法了,而是开启查询日志:

    DB::enableQueryLog();
    DB::sselect("select * from users limit 10");
    $log = DB::getQueryLog();

如果当前请求可能会建立多个连接,可以指定在某一个连接中获取查询日志,未指定的话将从最近一个连接中获取查询日志:

    DB::connection($con)->enableQueryLog();

我的个人博客:逐步前行STEP

mysql加锁语句:

selct * from table_name where id=1 for update

使用方式以及注意事项:

1、该语句必须在事务中执行才生效
2、如果该语句中的查询未正确使用索引(不一定是主键),则该语句会锁全表
3、如果该语句的查询中索引生效了,只会锁定查询的行
4、该锁会在事务提交的时候释放

我的个人博客:逐步前行STEP

示例:
1、将文章按类型的分组,并获取类型分组中最新的一篇文章

select author,max(`updated_at`) as updated_at from articles 
    group by category_id
    order by updated_at desc

2、将文章按类型的分组,并获取类型分组中阅读量最小的一篇文章

select author,min(`read_cnt`) as read_cnt from articles 
    group by category_id
    order by read_cnt

我的个人博客:逐步前行STEP

1、在配置文件添加:

innodb_force_recovery = 1;

2、重启mysql服务:service mysqld restart
3、登陆mysql,导出数据库
4、删除ibdata1、ib_logfile0、ib_logfile1文件和databasename(数据库名字)目录
5、注释掉第一步的配置:innodb_force_recovery = 1
6、重启mysql服务:service mysqld restart
7、登陆mysql,重建数据库,导入备份