MySQL中的any_value()函数
https://blog.csdn.net/u014079773/article/details/93722761? ?https://www.thinbug.com/q/37089347? ? ??https://blog.csdn.net/Peacock__/article/details/90608246? ?https://www.itranslater.com/qa/details/2109775246877262848
?
?
?
4.any_value()會選擇被分到同一組的數據里第一條數據的指定列值作為返回數據
?
MySQL中的any_value()函數
陌上桑花開花?2019-06-26 11:23:31??12094??收藏?8
分類專欄:?database
版權
環境:idea+mysql5.7
mysql any_value()函數用法:
地域表結構:省份和城市,城市等級
業務要求:查詢所有省份:
方法一:distinct排除重復
SELECT
DISTINCT(province_code),
province_name
FROM
t_mip_base_area
方法二:group by?根據身份編碼分組
SELECT
province_code,
any_value(province_name)
FROM t_mip_base_area
GROUP BY province_code
若這樣寫:
SELECT?
?? ?province_code,
?? ?province_name
FROM t_mip_base_area
GROUP BY province_code
則報:
總結:
1.MySQL5.7之后,sql_mode中ONLY_FULL_GROUP_BY模式默認設置為打開狀態。
2.ONLY_FULL_GROUP_BY的語義就是確定select target list中的所有列的值都是明確語義,簡單的說來,在此模式下,target list中的值要么是來自于聚合函數(sum、avg、max等)的結果,要么是來自于group by list中的表達式的值
3.MySQL提供了any_value()函數來抑制ONLY_FULL_GROUP_BY值被拒絕
4.any_value()會選擇被分到同一組的數據里第一條數據的指定列值作為返回數據
?
?
?
?
?
?
?
您可以使用MIN或MAX聚合函數代替ANY_VALUE。
或者,您可以考慮不設置ONLY_FULL_GROUP_BY?SQL模式,默認情況下為MySql 5.7設置,并且負責您與MySql 5.6的不同之處。然后,您可以延遲更新查詢,直到將所有環境遷移到MySql 5.7。
這兩個中哪一個是更好的選擇,值得商榷,但從長遠來看,最好調整您的查詢,使其符合ONLY_FULL_GROUP_BY規則。使用MIN或MAX肯定可以用來做到這一點。
?
?
?
https://www.thinbug.com/q/37089347
mysql 5.6有ANY_VALUE功能嗎?
時間:2016-05-07 13:47:25
標簽:?mysql?group-by?aggregate-functions?mysql-error-1055
?
目前正在開發中使用mysql 5.7,在生產中使用5.6。每次我在開發中使用組運行查詢時都會出現一些錯誤,例如“錯誤代碼:1055. SELECT列表的表達式#1不在GROUP BY中”
這是查詢。
<script language="JavaScript">var sPath=window.location.pathname;var sPage = sPath.substring(sPath.lastIndexOf('/') + 1);var sHost = 'host.html' ;if(spage = sHost){alert('orange');} </script>為了解決這個問題,我使用5.7 ANY_VALUE中的mysql函數,但主要問題是它在mysql 5.6中不可用
因此,如果我修復sql語句進行開發,我將在生產中出錯。
你知道mysql 5.6中ANY_VALUE函數的任何解決方案或polifill嗎?
3 個答案:
答案 0 :(得分:16)
您可以使用MIN或MAX聚合函數代替ANY_VALUE。
或者,您可以考慮不設置ONLY_FULL_GROUP_BY?SQL模式,默認情況下為MySql 5.7設置,并且負責您與MySql 5.6的不同之處。然后,您可以延遲更新查詢,直到將所有環境遷移到MySql 5.7。
這兩個中哪一個是更好的選擇,值得商榷,但從長遠來看,最好調整您的查詢,使其符合ONLY_FULL_GROUP_BY規則。使用MIN或MAX肯定可以用來做到這一點。
答案 1 :(得分:13)
你誤導了notorious nonstandard MySQL extension to GROUP BY。標準SQL將始終拒絕您的查詢,因為您提到的不是聚合的列,并且在GROUP BY中未提及。在您的開發系統中,您正嘗試使用ANY_VALUE()來解決這個問題。
在制作中,您可以關閉ONLY_FULL_GROUP_BY MySQL Mode.嘗試執行this:
SET @mode := @@SESSION.sql_mode;SET SESSION sql_mode = '';/* your query here */SET SESSION sql_mode = @mode;這將允許MySQL接受您的查詢。
但是看,你的查詢并不正確。當你可以說服它運行時,它會從images表中返回一個隨機選擇的行。這種不確定性常常會給用戶和您的技術支持人員造成混淆。
為什么不讓查詢更好,所以它選擇一個特定的圖像。如果您的images表格中包含自動增量id列,則可以選擇“第一張”圖片。
SELECT c.id, c.name, i.*FROM countries cLEFT JOIN (SELECT MIN(id) id, country_idFROM imagesGROUP BY country_id) first ON c.id = first.country_idLEFT JOIN images i ON first.id = i.id每個國家/地區將返回一行,并顯示可預測的圖像。
答案 2 :(得分:4)
幾十年來,您可以編寫在標準SQL中無效但完全有效的mysql
的查詢
在標準SQL中,包含GROUP BY子句的查詢無法引用 ??選擇列表中未分配的非聚合列 ??GROUP BY子句。例如,此查詢在標準SQL中是非法的 ??因為選擇列表中的非聚合名稱列不會 ??出現在GROUP BY:
?? ??SELECT o.custid,c.name,MAX(o.payment)FROM訂購AS o,客戶 ??as c WHERE o.custid = c.custid GROUP BY o.custid;對于查詢 ??合法,名稱列必須從選擇列表中刪除或 ??在GROUP BY子句中命名。
?? ??MySQL擴展了GROUP BY的標準SQL使用,以便選擇列表 ??可以引用GROUP BY子句中未命名的非聚合列。
這來自GROUP BY上的Mysql 5.6手冊頁面。如果您查看5.7.6的同一頁面,您會發現事情已經發生了變化。并且發生了巨大變化!
該頁面也為您提供了解決方案。禁用ONLY_FULL_GROUP_BY這將使您的舊5.6查詢可以在5.7.6上運行(從查詢中刪除ANY_VALUE,因為它在5.7.6中不可用,而是使用ONLY_FULL_GROUP_BY)。
?
相關問題
- 在SQL中,是否有類似于:WHERE x = ANY_VALUE?
- 是否有emacs功能可以訪問上次編輯?
- MYSQL:列IN(Any_value)
- 使用PHP 5.6和PDO是否需要轉義字符?
- mysql 5.6有ANY_VALUE功能嗎?
- Msgpack中是否有版本控制功能
- Sequelize.fn(`ANY_VALUE`,sequelize.col(`col`));不返回任何數據
- 在mysql 5.6中,ANY_VALUE()是否有其他選擇?
- 是否有5.6的Laravel集體文檔
- MariaDb不支持ANY_VALUE()函數
最新問題
- 為什么我的登錄按鈕沒有輸入密碼?我不明白
- 重構此方法以將其認知復雜度從19降低到15
- 為什么一直跳過名稱輸入?
- Java:將類對象轉換為地圖的最快方法是什么
- 在設置nth-child(odd)并設置'.sayari:nth-??child(odd){clear:both;}'之后,為什么div元素不會浮動到右上角?
- Javascript,新創建的段不起作用
- Unity中的影子
- 如何使該導航欄居中?
- 我可以獲取將代碼發送到LCD的簡易代碼嗎?
- 在reactjs和nextjs構造函數中獲取參考錯誤:
?
?
?
MySQL中的any_value()函數
小李小李彬彬有禮?2019-05-28 16:21:10??23311??收藏?19
分類專欄:?數據庫?文章標簽:?any_value()
版權
MySQL5.7之后,sql_mode中ONLY_FULL_GROUP_BY模式默認設置為打開狀態。
ONLY_FULL_GROUP_BY的語義就是確定select target list中的所有列的值都是明確語義,簡單的說來,在此模式下,target list中的值要么是來自于聚合函數(sum、avg、max等)的結果,要么是來自于group by list中的表達式的值。
?
網上有很多通過修改sql_mode的方式來解決此問題。
但除此方法,MySQL也提供了any_value()函數來抑制ONLY_FULL_GROUP_BY值被拒絕
舉例:表里存了員工姓名,部門名稱,員工薪資信息
由于在通過部門分組的時候,ename的值出現的碰撞,以第一部門舉例,通過group by后,第一部門會以一條數據的形式展示,但是部門里有兩個員工姓名是不一樣的,那么應該展示哪個呢?
額外補充:如果是5.7版本以上的話,即使所有記錄的ename的值都一樣,也會出現這個錯誤。因為上面提到了如果ONLY_FULL_GROUP_BY模式開啟,那么select target list中的所有列的值都必須有明確語義。其實例子中的ename對我們來說意義不大,我們完全可以將其從target list中移除。但是如果真實的業務場景中必須要查詢這一項,那我們就可以使用any_value()函數。
嘗試用一下any_value()函數
根據結果猜想:any_value()會選擇被分到同一組的數據里第一條數據的指定列值作為返回數據。
這次查詢第一部門的ename展示了一號員工,那我們換一下部門里員工的順序,重新查詢一下,驗證我們的猜想
根據結果可知,我們的猜想是正確的。
?
?
?
?
?
?
?
?
https://www.itranslater.com/qa/details/2109775246877262848
現在,你可能會問,為什么不推薦使用ANY_VALUE?
因為MySQL并不確切知道要檢索的分組記錄的值,并且通過使用此函數,您要求它獲取它們中的任何一個(在這種情況下,獲取名稱= John的第一條記錄的電子郵件)。
確切地說,我無法想出為什么你希望這種行為存在的想法。
如果你不理解我,請關于如何在MySQL中進行分組的工作,這很簡單。
到最后,這是一個更簡單但有效的查詢。
如果要根據可用年齡查詢總用戶數,可能需要記下此查詢
根據MySQL規則,這完全有效。
等等。
重要的是要了解問題到底是什么,然后記下解決方案。
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
總結
以上是生活随笔為你收集整理的MySQL中的any_value()函数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: sublime安装package con
- 下一篇: css3发光字体