一些常见功能的查询sql

news/2024/11/15 21:51:12/文章来源:https://www.cnblogs.com/Ajue/p/18202443

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

一些常见功能的查询sql

日期:2019-4-10 阿珏 折腾代码 浏览:1462次 评论: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");
$rank = $temp['RANK'];
无法直接查询到上一名选手票数
if ($temp['total+jewel_vote+forge_vote']) {//这里查询出来的是和第一名选手相差的票数
    $up = $temp['total+jewel_vote+forge_vote']-$competition['all'];
}
方法一(定义变量累加排序)
$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 ");
foreach ($temp as $key => $value) {if ($value['cid'] == $cid) {//当前自己的排名$rank = $value['rank'];if ($up) {$up = $up - ($value['total'] +  $value['forge_vote'] + $value['jewel_vote']);}break;}//和上一名选手相差的票数$up = $value['total'] +  $value['forge_vote'] + $value['jewel_vote'];
}
2、场景:查询一篇文章的上一篇和下一篇,支持断号
$sql = "
SELECT*
FROM" . DB::table($this->_table) . "
WHEREaid IN (SELECTCASEWHEN SIGN(aid - {$id}) > 0 THEN MIN(aid)WHEN SIGN(aid - {$id}) < 0 THEN MAX(aid)END AS aidFROMpre_exe_articleWHEREaid <> {$id}GROUP BYSIGN(aid - {$id})ORDER BYSIGN(aid - {$id}))
ORDER BYaid ASC";
return DB::fetch_all($sql);
3、批量更新MySQL多条记录的多个字段
mysql更新语句很简单,更新一条数据的某个字段,一般这样写:
UPDATE mytable SET myfield = 'value' WHERE id = '1';
如果更新同一字段为同一个值,mysql也很简单,修改下where即可:
UPDATE mytable SET myfield = 'value' WHERE id in (1,2,3);
那如果更新多条数据为不同的值,可能很多人会这样写:
foreach ($display_order as $id => $ordinal) {$sql = "UPDATE categories SET display_order = $ordinal WHERE id = $id";mysql_query($sql);
}
即是循环一条一条的更新记录。
一条记录update一次,这样性能很差,也很容易造成阻塞。

那么能不能一条sql语句实现批量更新呢?
mysql并没有提供直接的方法来实现批量更新,但是可以用点小技巧来实现。
UPDATE mytable SETmyfield = CASE idWHEN 1 THEN '3'WHEN 2 THEN '4'WHEN 3 THEN '5'END
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行数据执行。

更新多值
UPDATE categories SETdisplay_order = CASE idWHEN 1 THEN 3WHEN 2 THEN 4WHEN 3 THEN 5END,title = CASE idWHEN 1 THEN 'New Title 1'WHEN 2 THEN 'New Title 2'WHEN 3 THEN 'New Title 3'END
WHERE id IN (1,2,3)
封装成PHP函数,传入相应数据,一键生成sql
  /*** 批量更新函数* @param $data array 待更新的数据,二维数组格式* @param array $params array 值相同的条件,键值对应的一维数组* @param string $table array 表* @param string $field string 值不同的条件,默认为id* @return bool|string*/
function batchUpdate($data, $field, $table ,$params = [])
{if (!is_array($data) || !$field || !$table || !is_array($params)) {return false;}
$updates = parseUpdate($data, $field);
$where = parseParams($params);// 获取所有键名为$field列的值,值两边加上单引号,保存在$fields数组中
// array_column()函数需要PHP5.5.0+,如果小于这个版本,可以自己实现,
// 参考地址:http://php.net/manual/zh/function.array-column.php#118831
$fields = array_column($data, $field);
$fields = implode(',', array_map(function($value) {return "'".$value."'";
}, $fields));$sql = sprintf("UPDATE `%s` SET %s WHERE `%s` IN (%s) %s", $table, $updates, $field, $fields, $where);

return $sql;
}

/**

  • 将二维数组转换成CASE WHEN THEN的批量更新条件

  • @param $data array 二维数组

  • @param $field string 列名

  • @return string sql语句
    */
    function parseUpdate($data, $field)
    {
    $sql = '';
    $keys = array_keys(current($data));
    foreach ($keys as $column) {

     $sql .= sprintf("`%s` = CASE `%s` \n", $column, $field);foreach ($data as $line) {$sql .= sprintf("WHEN '%s' THEN '%s' \n", $line[$field], $line[$column]);}$sql .= "END,";
    

    }

    return rtrim($sql, ',');
    }

/**

  • 解析where条件

  • @param $params

  • @return array|string
    */
    function parseParams($params)
    {
    $where = [];
    foreach ($params as $key => $value) {
    $where[] = sprintf("%s = '%s'", $key, $value);
    }

    return $where ? ' AND ' . implode(' AND ', $where) : '';
    }


批量替换字符串

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



本博客所有文章如无特别注明均为原创。作者:阿珏复制或转载请以超链接形式注明转自阿珏博客
原文地址《一些常见功能的查询sql

网友评论:

头条新闻 2年前 (2019-04-11)
文章不错非常喜欢

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/709328.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

微信授权登录

微信的授权登录和QQ、新浪等平台的授权登录都大同小异,均采用 Oauth OAuth2.0鉴权方式。Tips:当你看到这个提示的时候,说明当前的文章是由原emlog博客系统搬迁至此的,文章发布时间已过于久远,编排和内容不一定完整,还请谅解` 微信授权登录 日期:2019-4-5 阿珏 折腾代码…

国产邪神手办开箱

“邪神”正是用于描述这些表情崩坏到离谱,细节不堪到令人发指的手办。 说起“邪神”,大家也许第一感觉就是“邪神四姐妹”,其实都是让人膜拜的存在,四大邪神的威名万世传扬,不仅可以辟邪,而且摆出来非常长脸有没有,杀人不见血的强大武器Tips:当你看到这个提示的时候,说…

免费的云渲染平台有哪些?哪些平台性价比较高?

随着3D建模和渲染技术的发展,云渲染平台已成为很多设计师的重要工具。这些平台通过提供高性能的远程渲染服务,帮助用户加速渲染过程。但是市场上云渲染平台很多,有哪些是免费的吗?有哪些平台性价比较高? 1、免费的云渲染平台有哪些? 目前,市场上不存在完全不需要支付任何…

这下真鸽了

完了完了,这下真鸽了,上上个月的年终总结还在夸自己去年每个月都有勤奋的发博客,然而flag果然是用来打破的。Tips:当你看到这个提示的时候,说明当前的文章是由原emlog博客系统搬迁至此的,文章发布时间已过于久远,编排和内容不一定完整,还请谅解` 这下真鸽了 日期:2019…

VUE,HbuilderX开发H5页面,配置调试,部署以及JWT,Token。调用本机netcore接口

花了一周时间,测试了各种方式。对于VUE开发H5页面,然后部署到Nginx服务。再调用本地的HTTPS接口。1、本地开发及使用IE或Chrome进行开发调试,并调用本地接口同步开发。本地Netcore,开发按原有方式进行。Hbuilderx,开发并调用本地接口。设置时,不要使用Https进行。直接用h…

某东h5st4.7 加密参数(二)

接着上一篇文章,由于最近比较忙,没有时间看。今天有时间看看上一篇没有说完的其他加密参数。仅供学习交流! 1、fp的生成,搜索关键词 fingerprint ,即可查看到生成位置调试可以找到生成位置2、请求获取tk algo中参数expandParams,如下图调试可以获取到参数expandParams从…

最初,进入二次元是什么时候?

最初,进入二次元是什么时候呢?或许是一部吸引人的动漫,是一位帅气漂亮的人物,也许是一次不经意的一撇,也许是一位朋友的强烈推荐,Tips:当你看到这个提示的时候,说明当前的文章是由原emlog博客系统搬迁至此的,文章发布时间已过于久远,编排和内容不一定完整,还请谅解`…

mit6.828笔记 - lab4 Part B:写时复制Fork

Part B Copy-on-Write Fork Unix 提供 fork() 系统调用作为主要的进程创建基元。fork()系统调用复制调用进程(父进程)的地址空间,创建一个新进程(子进程)。 不过,在调用 fork() 之后,子进程往往会立即调用 exec(),用新程序替换子进程的内存。例如,shell 通常就是这么…

萌音影视 - 在线影视应用

萌音影视 - 在线影视应用 基于优雅的 laravel 框架和一点都不妹子的 妹子UI 的在线影视应用Tips:当你看到这个提示的时候,说明当前的文章是由原emlog博客系统搬迁至此的,文章发布时间已过于久远,编排和内容不一定完整,还请谅解` 萌音影视 - 在线影视应用 日期:2018-9-25 …

这本轻小说真厉害!

《我的青春恋爱物语果然有问题》连续三年蝉联这本轻小说真厉害的榜首!因为大春物实力太作弊,当年大老师不仅在男生分类第一,就连全部角色排名也获得了第一位。Tips:当你看到这个提示的时候,说明当前的文章是由原emlog博客系统搬迁至此的,文章发布时间已过于久远,编排和内…

放学后茶会

如果要给回忆的碎片 取名保存起来 我想 “宝物”再合适不过Tips:当你看到这个提示的时候,说明当前的文章是由原emlog博客系统搬迁至此的,文章发布时间已过于久远,编排和内容不一定完整,还请谅解` 放学后茶会 日期:2018-9-14 阿珏 二次元 浏览:1829次 评论:3条ねぇ呐如…

经纬恒润第三代重载自动驾驶平板车

为了应对港口无人化运营在实质化落地过程的挑战,经纬恒润借助自身在无人驾驶领域的深厚积累与实践,改款升级了新一代重载自动驾驶平板车。 随着无人驾驶在封闭场地和干线道路场景的加速落地,港口作为无人化运营的先行者,其场景的复杂度、特殊性对无人化运营的技术提出…