mysql查詢?nèi)绾稳サ舳嘤嗔?/h1>
更新時(shí)間:2024年01月11日 15:49:29 作者:拿命搏未〃來(lái)
這篇文章主要介紹了mysql查詢?nèi)绾稳サ舳嘤嗔銌?wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
mysql查詢?nèi)サ舳嘤嗔?/h2>
mysql 查詢decimal去掉多余零 0+cast(field as char)
thinkphp指定查詢字段方法增加$format參數(shù)
/**
* 指定查詢字段
* @access public
* @param mixed $field 字段信息
* @param mixed $format 需要去掉多余0的 decimal字段
* @return $this
*/
public function field($field,$format=null)
{
if (empty($field)) {
return $this;
} elseif ($field instanceof Raw) {
$this->options['field'][] = $field;
return $this;
}
if (is_string($field)) {
if (preg_match('/[\<\'\"\(]/', $field)) {
return $this->fieldRaw($field);
}
$field = array_map('trim', explode(',', $field));
}
if (true === $field) {
// 獲取全部字段
$fields = $this->getTableFields();
$field = $fields ?: ['*'];
}
if (isset($this->options['field'])) {
$field = array_merge((array) $this->options['field'], $field);
}
if ($format) {
$castField = [];
if(is_string($format)) $format = explode(',',$format);
if(is_array($format)){
foreach($format as $v){
$asField = str_replace(".","_",$v);
$castField[] = '0+cast('.$v.' as char) AS '.$asField;
}
}
$field = array_merge($field,$castField);
}
$this->options['field'] = array_unique($field);
return $this;
}
mysql查詢常見(jiàn)問(wèn)題
一、先排序后分組
1、MySQL版本5.6
首先order by然后group by
SELECT
id,
chat_id,
content,
create_time
FROM
( SELECT id, chat_id, content, create_time FROM im_chat_message ORDER BY create_time DESC ) a
GROUP BY
chat_id
ORDER BY
create_time DESC
2、MySQL版本5.7
MySQL5.7對(duì)子查詢進(jìn)行了優(yōu)化,認(rèn)為子查詢中的order by可以進(jìn)行忽略,只要Derived table里不包含如下條件就可以進(jìn)行優(yōu)化:UNION clause、GROUP BY、DISTINCT、Aggregation、LIMIT or OFFSET
SELECT
id,
chat_id,
content,
create_time
FROM
( SELECT id, chat_id, content, create_time FROM im_chat_message ORDER BY create_time DESC LIMIT 999999999 ) a
GROUP BY
chat_id
ORDER BY
create_time DESC
3、MySQL版本>=8.0
采用
ROW_NUMBER() over ( PARTITION BY chat_id ORDER BY create_time DESC )
SELECT
id,
chat_id,
content,
create_time
FROM
(
SELECT
id,
chat_id,
content,
create_time,
ROW_NUMBER() over ( PARTITION BY chat_id ORDER BY create_time DESC ) AS rn
FROM
im_chat_message
ORDER BY
create_time DESC
) a
WHERE
rn =1
二、order by limit導(dǎo)致分頁(yè)出現(xiàn)重復(fù)數(shù)據(jù)
從 MySQL 5.6 版本開(kāi)始,優(yōu)化器在使用 order by limit 時(shí)做了優(yōu)化,導(dǎo)致排序字段沒(méi)有使用索引時(shí)使用堆排序。
堆排序是不穩(wěn)定的,多次排序后,各個(gè)數(shù)的相對(duì)位置發(fā)生了變化。
解決措施有兩種方式:
1、排序字段加上索引。
2、在 order by 排序字段里,添加有索引的字段,比如主鍵ID。在排序時(shí)可以保證順序穩(wěn)定。
三、新增數(shù)據(jù)導(dǎo)致分頁(yè)出現(xiàn)重復(fù)數(shù)據(jù)
新增數(shù)據(jù)導(dǎo)致數(shù)據(jù)總量發(fā)生了變化。
解決措施如下:
查詢出當(dāng)頁(yè)數(shù)據(jù)后,記錄本次拉取位置。
下次請(qǐng)求時(shí),將上次獲取的拉取位置傳給后端,后端從該拉取位置開(kāi)始分頁(yè)。
WHERE
1 =1
<if test="null != query.minId">
and id < #{query.minId}
</if>
LIMIT #{query.size}
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
-
K8s 如何部署 MySQL 8.0.20 主從復(fù)制結(jié)構(gòu)
這篇文章主要介紹了K8s 如何部署 MySQL 8.0.20 主從復(fù)制結(jié)構(gòu),本次使用 OpenEBS 來(lái)作為存儲(chǔ)引擎,OpenEBS 是一個(gè)開(kāi)源的、可擴(kuò)展的存儲(chǔ)平臺(tái),它提供了一種簡(jiǎn)單的方式來(lái)創(chuàng)建和管理持久化存儲(chǔ)卷,需要的朋友可以參考下 2024-04-04
-
mysql觸發(fā)器一個(gè)表改變另一個(gè)表也改變問(wèn)題
這篇文章主要介紹了mysql觸發(fā)器一個(gè)表改變另一個(gè)表也改變問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教 2023-08-08
-
mysql創(chuàng)建表分區(qū)的實(shí)現(xiàn)示例
表分區(qū)是指根據(jù)一定規(guī)則,將數(shù)據(jù)庫(kù)中的一張表分解成多個(gè)更小的,容易管理的部分,本文主要介紹了mysql創(chuàng)建表分區(qū)的實(shí)現(xiàn)示例,感興趣的可以了解一下 2024-01-01
-
MySQL創(chuàng)建和刪除數(shù)據(jù)庫(kù)的命令及相關(guān)PHP腳本的操作方法
這篇文章主要介紹了MySQL創(chuàng)建和刪除數(shù)據(jù)庫(kù)的命令及相關(guān)PHP腳本的操作方法,這里主要講述Linux中在mysqladmin下的命令操作,需要的朋友可以參考下 2015-11-11
-
淺談Mysql、SqlServer、Oracle三大數(shù)據(jù)庫(kù)的區(qū)別
這篇文章主要介紹了Mysql、SqlServer、Oracle三大數(shù)據(jù)庫(kù)的區(qū)別,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
2019-04-04
-
Mysql8導(dǎo)入數(shù)據(jù)到Mysql5.7的實(shí)現(xiàn)步驟
Mysql8的默認(rèn)字符集為utf8mb4,當(dāng)我們有需求要把Mysql8的數(shù)據(jù)導(dǎo)入到Mysql5.7時(shí),就會(huì)出現(xiàn)不支持,本文主要介紹了2種解決方法,具有一定的參考價(jià)值,感興趣的可以了解一下 2022-03-03
最新評(píng)論
mysql查詢?nèi)サ舳嘤嗔?/h2>
mysql 查詢decimal去掉多余零 0+cast(field as char)
thinkphp指定查詢字段方法增加$format參數(shù)
/** * 指定查詢字段 * @access public * @param mixed $field 字段信息 * @param mixed $format 需要去掉多余0的 decimal字段 * @return $this */ public function field($field,$format=null) { if (empty($field)) { return $this; } elseif ($field instanceof Raw) { $this->options['field'][] = $field; return $this; } if (is_string($field)) { if (preg_match('/[\<\'\"\(]/', $field)) { return $this->fieldRaw($field); } $field = array_map('trim', explode(',', $field)); } if (true === $field) { // 獲取全部字段 $fields = $this->getTableFields(); $field = $fields ?: ['*']; } if (isset($this->options['field'])) { $field = array_merge((array) $this->options['field'], $field); } if ($format) { $castField = []; if(is_string($format)) $format = explode(',',$format); if(is_array($format)){ foreach($format as $v){ $asField = str_replace(".","_",$v); $castField[] = '0+cast('.$v.' as char) AS '.$asField; } } $field = array_merge($field,$castField); } $this->options['field'] = array_unique($field); return $this; }
mysql查詢常見(jiàn)問(wèn)題
一、先排序后分組
1、MySQL版本5.6
首先order by然后group by
SELECT id, chat_id, content, create_time FROM ( SELECT id, chat_id, content, create_time FROM im_chat_message ORDER BY create_time DESC ) a GROUP BY chat_id ORDER BY create_time DESC
2、MySQL版本5.7
MySQL5.7對(duì)子查詢進(jìn)行了優(yōu)化,認(rèn)為子查詢中的order by可以進(jìn)行忽略,只要Derived table里不包含如下條件就可以進(jìn)行優(yōu)化:UNION clause、GROUP BY、DISTINCT、Aggregation、LIMIT or OFFSET
SELECT id, chat_id, content, create_time FROM ( SELECT id, chat_id, content, create_time FROM im_chat_message ORDER BY create_time DESC LIMIT 999999999 ) a GROUP BY chat_id ORDER BY create_time DESC
3、MySQL版本>=8.0
采用
ROW_NUMBER() over ( PARTITION BY chat_id ORDER BY create_time DESC )
SELECT id, chat_id, content, create_time FROM ( SELECT id, chat_id, content, create_time, ROW_NUMBER() over ( PARTITION BY chat_id ORDER BY create_time DESC ) AS rn FROM im_chat_message ORDER BY create_time DESC ) a WHERE rn =1
二、order by limit導(dǎo)致分頁(yè)出現(xiàn)重復(fù)數(shù)據(jù)
從 MySQL 5.6 版本開(kāi)始,優(yōu)化器在使用 order by limit 時(shí)做了優(yōu)化,導(dǎo)致排序字段沒(méi)有使用索引時(shí)使用堆排序。
堆排序是不穩(wěn)定的,多次排序后,各個(gè)數(shù)的相對(duì)位置發(fā)生了變化。
解決措施有兩種方式:
1、排序字段加上索引。
2、在 order by 排序字段里,添加有索引的字段,比如主鍵ID。在排序時(shí)可以保證順序穩(wěn)定。
三、新增數(shù)據(jù)導(dǎo)致分頁(yè)出現(xiàn)重復(fù)數(shù)據(jù)
新增數(shù)據(jù)導(dǎo)致數(shù)據(jù)總量發(fā)生了變化。
解決措施如下:
查詢出當(dāng)頁(yè)數(shù)據(jù)后,記錄本次拉取位置。
下次請(qǐng)求時(shí),將上次獲取的拉取位置傳給后端,后端從該拉取位置開(kāi)始分頁(yè)。
WHERE 1 =1 <if test="null != query.minId"> and id < #{query.minId} </if> LIMIT #{query.size}
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
K8s 如何部署 MySQL 8.0.20 主從復(fù)制結(jié)構(gòu)
這篇文章主要介紹了K8s 如何部署 MySQL 8.0.20 主從復(fù)制結(jié)構(gòu),本次使用 OpenEBS 來(lái)作為存儲(chǔ)引擎,OpenEBS 是一個(gè)開(kāi)源的、可擴(kuò)展的存儲(chǔ)平臺(tái),它提供了一種簡(jiǎn)單的方式來(lái)創(chuàng)建和管理持久化存儲(chǔ)卷,需要的朋友可以參考下2024-04-04mysql觸發(fā)器一個(gè)表改變另一個(gè)表也改變問(wèn)題
這篇文章主要介紹了mysql觸發(fā)器一個(gè)表改變另一個(gè)表也改變問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-08-08mysql創(chuàng)建表分區(qū)的實(shí)現(xiàn)示例
表分區(qū)是指根據(jù)一定規(guī)則,將數(shù)據(jù)庫(kù)中的一張表分解成多個(gè)更小的,容易管理的部分,本文主要介紹了mysql創(chuàng)建表分區(qū)的實(shí)現(xiàn)示例,感興趣的可以了解一下2024-01-01MySQL創(chuàng)建和刪除數(shù)據(jù)庫(kù)的命令及相關(guān)PHP腳本的操作方法
這篇文章主要介紹了MySQL創(chuàng)建和刪除數(shù)據(jù)庫(kù)的命令及相關(guān)PHP腳本的操作方法,這里主要講述Linux中在mysqladmin下的命令操作,需要的朋友可以參考下2015-11-11淺談Mysql、SqlServer、Oracle三大數(shù)據(jù)庫(kù)的區(qū)別
這篇文章主要介紹了Mysql、SqlServer、Oracle三大數(shù)據(jù)庫(kù)的區(qū)別,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04Mysql8導(dǎo)入數(shù)據(jù)到Mysql5.7的實(shí)現(xiàn)步驟
Mysql8的默認(rèn)字符集為utf8mb4,當(dāng)我們有需求要把Mysql8的數(shù)據(jù)導(dǎo)入到Mysql5.7時(shí),就會(huì)出現(xiàn)不支持,本文主要介紹了2種解決方法,具有一定的參考價(jià)值,感興趣的可以了解一下2022-03-03