Tips:当你看到这个提示的时候,说明当前的文章是由原emlog博客系统搬迁至此的,文章发布时间已过于久远,编排和内容不一定完整,还请谅解`

一些常见功能的查询sql

日期:2019-4-10 阿珏 折腾代码 浏览:1462次 评论:1条

1、场景:查询一个选手的排名及距离上一名差多少票

方法二(去重排序查询比自己少的数量)

  1. $temp = DB::fetch_first("SELECT distinct total+jewel_vote+forge_vote ,COUNT(*)+1 AS RANK FROM " . DB::table('vote_competition') ." WHERE total+jewel_vote+forge_vote>" . $competition['all'] . " and aid={$aid} ORDER by forge_vote desc");
  2. $rank = $temp['RANK'];
  3. 无法直接查询到上一名选手票数
  4. if ($temp['total+jewel_vote+forge_vote']) {
  5. //这里查询出来的是和第一名选手相差的票数
  6.     $up = $temp['total+jewel_vote+forge_vote']-$competition['all'];
  7. }

方法一(定义变量累加排序)

  1. $temp = DB::fetch_all("SELECT a.cid,a.total,a.forge_vote,a.jewel_vote,(@rowNum:=@rowNum+1) AS rank FROM pre_vote_competition AS a, (SELECT (@rowNum :=0) ) b WHERE aid={$aid} ORDER BY (a.total+a.forge_vote+a.jewel_vote) DESC ");
  2. foreach ($temp as $key => $value) {
  3. if ($value['cid'] == $cid) {
  4. //当前自己的排名
  5. $rank = $value['rank'];
  6. if ($up) {
  7. $up = $up - ($value['total'] + $value['forge_vote'] + $value['jewel_vote']);
  8. }
  9. break;
  10. }
  11. //和上一名选手相差的票数
  12. $up = $value['total'] + $value['forge_vote'] + $value['jewel_vote'];
  13. }

2、场景:查询一篇文章的上一篇和下一篇,支持断号

  1. $sql = "
  2. SELECT
  3. *
  4. FROM
  5. " . DB::table($this->_table) . "
  6. WHERE
  7. aid IN (
  8. SELECT
  9. CASE
  10. WHEN SIGN(aid - {$id}) > 0 THEN MIN(aid)
  11. WHEN SIGN(aid - {$id}) < 0 THEN MAX(aid)
  12. END AS aid
  13. FROM
  14. pre_exe_article
  15. WHERE
  16. aid <> {$id}
  17. GROUP BY
  18. SIGN(aid - {$id})
  19. ORDER BY
  20. SIGN(aid - {$id})
  21. )
  22. ORDER BY
  23. aid ASC";
  24. return DB::fetch_all($sql);

3、批量更新MySQL多条记录的多个字段

mysql更新语句很简单,更新一条数据的某个字段,一般这样写:

  1. UPDATE mytable SET myfield = 'value' WHERE id = '1';

如果更新同一字段为同一个值,mysql也很简单,修改下where即可:

  1. UPDATE mytable SET myfield = 'value' WHERE id in (1,2,3);

那如果更新多条数据为不同的值,可能很多人会这样写:

  1. foreach ($display_order as $id => $ordinal) {
  2. $sql = "UPDATE categories SET display_order = $ordinal WHERE id = $id";
  3. mysql_query($sql);
  4. }

即是循环一条一条的更新记录。

一条记录update一次,这样性能很差,也很容易造成阻塞。

那么能不能一条sql语句实现批量更新呢?

mysql并没有提供直接的方法来实现批量更新,但是可以用点小技巧来实现。

  1. UPDATE mytable SET
  2. myfield = CASE id
  3. WHEN 1 THEN '3'
  4. WHEN 2 THEN '4'
  5. WHEN 3 THEN '5'
  6. END
  7. WHERE id IN (1,2,3)

这句sql的意思是,更新display_order 字段:

  • 如果id=1 则display_order 的值为3,
  • 如果id=2 则 display_order 的值为4,
  • 如果id=3 则 display_order 的值为5。

即是将条件语句写在了一起。

这里的where部分不影响代码的执行,但是会提高sql执行的效率。

确保sql语句仅执行需要修改的行数,这里只有3条数据进行更新,而where子句确保只有3行数据执行。

更新多值

  1. UPDATE categories SET
  2. display_order = CASE id
  3. WHEN 1 THEN 3
  4. WHEN 2 THEN 4
  5. WHEN 3 THEN 5
  6. END,
  7. title = CASE id
  8. WHEN 1 THEN 'New Title 1'
  9. WHEN 2 THEN 'New Title 2'
  10. WHEN 3 THEN 'New Title 3'
  11. END
  12. WHERE id IN (1,2,3)

封装成PHP函数,传入相应数据,一键生成sql

  1. /**
  2. * 批量更新函数
  3. * @param $data array 待更新的数据,二维数组格式
  4. * @param array $params array 值相同的条件,键值对应的一维数组
  5. * @param string $table array 表
  6. * @param string $field string 值不同的条件,默认为id
  7. * @return bool|string
  8. */
  9. function batchUpdate($data, $field, $table ,$params = [])
  10. {
  11. if (!is_array($data) || !$field || !$table || !is_array($params)) {
  12. return false;
  13. }
  14. $updates = parseUpdate($data, $field);
  15. $where = parseParams($params);
  16. // 获取所有键名为$field列的值,值两边加上单引号,保存在$fields数组中
  17. // array_column()函数需要PHP5.5.0+,如果小于这个版本,可以自己实现,
  18. // 参考地址:http://php.net/manual/zh/function.array-column.php#118831
  19. $fields = array_column($data, $field);
  20. $fields = implode(',', array_map(function($value) {
  21. return "'".$value."'";
  22. }, $fields));
  23. $sql = sprintf("UPDATE `%s` SET %s WHERE `%s` IN (%s) %s", $table, $updates, $field, $fields, $where);
  24. return $sql;
  25. }
  26. /**
  27. * 将二维数组转换成CASE WHEN THEN的批量更新条件
  28. * @param $data array 二维数组
  29. * @param $field string 列名
  30. * @return string sql语句
  31. */
  32. function parseUpdate($data, $field)
  33. {
  34. $sql = '';
  35. $keys = array_keys(current($data));
  36. foreach ($keys as $column) {
  37. $sql .= sprintf("`%s` = CASE `%s` \n", $column, $field);
  38. foreach ($data as $line) {
  39. $sql .= sprintf("WHEN '%s' THEN '%s' \n", $line[$field], $line[$column]);
  40. }
  41. $sql .= "END,";
  42. }
  43. return rtrim($sql, ',');
  44. }
  45. /**
  46. * 解析where条件
  47. * @param $params
  48. * @return array|string
  49. */
  50. function parseParams($params)
  51. {
  52. $where = [];
  53. foreach ($params as $key => $value) {
  54. $where[] = sprintf("`%s` = '%s'", $key, $value);
  55. }
  56. return $where ? ' AND ' . implode(' AND ', $where) : '';
  57. }

批量替换字符串

  1. UPDATE `emlog_blog` SET `content` = replace (`content`,'ws2.sinaimg.cn','cdn.sinaimg.cn.52ecy.cn') WHERE `content` LIKE '%ws2.sinaimg.cn%'

网友评论:

头条新闻 2年前 (2019-04-11)

文章不错非常喜欢

一些常见功能的查询sql的更多相关文章

  1. 【原创】Newlife.XCode的常见功能使用(一)查询与数据初始化

            本博客所有文章分类的总目录:http://www.cnblogs.com/asxinyu/p/4288836.html Newlife XCode组件相关文章目录:http://www ...

  2. SQL Server2016 新功能实时查询统计信息

    SQL Server2016 新功能实时查询统计信息 很多时候有这样的场景,开发抱怨DBA没有调优好数据库,DBA抱怨开发写的程序代码差,因此,DBA和开发都成为了死对头,无法真正排查问题. DBA只 ...

  3. Atiit 常见功能 常用功能与模块的最快速解决方案

    Atiit 常见功能 常用功能与模块的最快速解决方案 一.大力使用第三方API接口 一.导出excel jquery.table2excel 二.Form表单验证,使用h5验证属性 验证发生在form ...

  4. Entity Frameword 查询 sql func linq 对比

    Entity Framework是个好东西,虽然没有Hibernate功能强大,但使用更简便.今天整理一下常见SQL如何用EF来表达,Func形式和Linq形式都会列出来(本人更多在用Func形式,l ...

  5. Lucene.net常见功能实现知识汇总

    在开发SearchEasy Site SearchEngine(搜易站内搜索引擎)的时候,经常会遇到一些搜索引擎的常见功能如何实现的问题,比如实现相关度百分比显示?如何实现在结果中搜索等等诸如此类常见 ...

  6. 面试官:说说一条查询sql的执行流程和底层原理?

    一条查询SQL执行流程图如下 序章 自我介绍 我是一条sql,就是一条长长的字符串,不要问我长什么样,因为我比较傲娇. 额~~不是我不说啊,因为细说起来,我可以细分为DML(Update.Insert ...

  7. 一个网络设备的常见功能--连通性检查SSRF漏洞--被黑客利用当做扫描器

    一.我们先来看一下很多网络设备都有的一个常见功能--连通性测试: 很多网络设备都具备与其他设备通信,联动的功能,例如网络设备联动安全设备,网络设备联动认证设备等等.此时都需要一个对端IP和对端端口号作 ...

  8. 在MySQL中使用explain查询SQL的执行计划

    1.什么是MySQL执行计划 要对执行计划有个比较好的理解,需要先对MySQL的基础结构及查询基本原理有简单的了解. MySQL本身的功能架构分为三个部分,分别是 应用层.逻辑层.物理层,不只是MyS ...

  9. asp.net 查询sql数据表的网页模板

    最近因为工作需求,要制作一个网页模板,主要是用于快速开发,可以查询Sql数据表信息的模板, 昨天做好了,这个只是一个Demo,但是功能已经齐全了, 开发新的网站时,需要新增一个xml,复制粘贴网页的前 ...

  10. MySQL常见的8种SQL错误用法

    MySQL常见的8种SQL错误用法 前言 MySQL在2016年仍然保持强劲的数据库流行度增长趋势.越来越多的客户将自己的应用建立在MySQL数据库之上,甚至是从Oracle迁移到MySQL上来.但也 ...

随机推荐

  1. [PHP] 业务逻辑大内存占用的优化思路, yield 和 chunk

      示例: header("content-type:text/html;charset=utf-8"); function readTxt() { $handle = fopen ...

  2. 临时容器ephermeral(20)

    一.临时容器ephermeral概述 参考官方文档: https://kubernetes.io/zh/docs/concepts/workloads/pods/ephemeral-container ...

  3. vue3 快速入门系列 —— 状态管理 pinia

    其他章节请看: vue3 快速入门 系列 pinia vue3 状态管理这里选择 pinia. 虽然 vuex4 已支持 Vue 3 的 Composition API,但是 vue3 官网推荐新的应 ...

  4. .Net项目部署到Docker

    .Net项目部署到Docker 环境 linux docker .Net 7 步骤 编写Dockerfile 上传项目文件到linux 运行项目文件到docker 一.设置项目端口 在Program. ...

  5. Solution Set - 矩阵加速

    A[HDU2604]求不含子串010和000的,长为\(n\)的01序列数. B[HDU6470]数列\(\{a_n\}:a_1=1,a_2=2,a_n=a_{n-1}+2a_{n-2}+n^3\), ...

  6. Goland 的配置

    目录 下载安装 设置好go的系统环境变量 设置 GOROOT 设置 GOPATH 设置 MODULES 设置 工作面板里的字体缩放大小快捷键 安装主题包 安装中文中包 Redis Mannager 读 ...

  7. Linux系统中如何部署php

    1. 在线安装 Apache 服务器 ubuntu 可通过"apt"等命令在线安装,centos用yum. # ubuntu sudo apt-get install apache ...

  8. Oracle数据库下的DDL、DML、DQL、TCL、DCL

    首发微信公众号:SQL数据库运维 原文链接:https://mp.weixin.qq.com/s?__biz=MzI1NTQyNzg3MQ==&mid=2247485212&idx=1 ...

  9. 扩展实现Unity协程的完整栈跟踪

    现如今Unity中的协程(Coroutine)方案已显得老旧,Unitask等异步方案可以做到异常捕获等yield关键字处理起来很麻烦的问题, 并且Unity官方也在开发一套异步方案,但对于临时加入到 ...

  10. pageoffice6 版本实现在线打开word 文件禁止保存、禁止另存、禁止打印的需求

    在实际项目需求中,有时需要限制用户的保存.另存.打印文件操作,实现此效果只需在OnPageOfficeCtrlInit或AfterDocumentOpened事件中调用js设置PageOffice控件 ...