2017-03-02 22 views
2

我剛剛升級到mysql 5.7.14,並導致我的某個查詢出現問題,並且出現錯誤。如何在不更改my.ini文件的情況下讓我的查詢mysql 5.7兼容

#1055 - SELECT列表中的表達#1不處於GROUP BY子句和包含非聚集列「salesinvoice.InvoiceDate」 ,其並不功能依賴於GROUP BY子句中的列; 這是不兼容的sql_mode = only_full_group_by

現在的解決方案顯然是編輯my.ini文件,並添加此行

sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION 

現在這個工作,現在我的查詢運行正常,但我寧願讓我的查詢mysql 5.7兼容,而不必添加行到我的ini文件,這可能會或可能無法在我們的服務器上工作。我無法訪問服務器上的ini文件,但我在本地服務器上運行wampserver 3.06。

這裏是我的查詢

SELECT DATE_FORMAT(`InvoiceDate`,'%Y-%m') as InvoiceDate, 
     ROUND((SUM(`Unit_Cost`*`Quantity`)*`ExchangeRate`)+`VATValue`,2) as amount 
FROM `salesinvoice` 
LEFT JOIN `salesinvoice_products` 
    on `salesinvoice`.`SalesInvoice_id`=`salesinvoice_products`.`SalesInvoice_id` 
WHERE `InvoiceDate` < Now() 
    and `InvoiceDate` > DATE_ADD(Now(), INTERVAL- 6 MONTH) 
GROUP BY Month(`InvoiceDate`) 

如何更改我的查詢是mysql的5.7標準,並沒有什麼錯誤消息究竟意味着什麼?

+0

我只希望它按月分組,因爲我在過去六個月 –

+0

獲得月度數據要擺脫錯誤的,你可以'GROUP BY DATE_FORMAT(InvoiceDate,「%Y-%M」),EXCHANGERATE ,VATValue'。如果你認爲這是錯誤的,那麼你的原始查詢是沒有意義的。 –

回答

1

MySQL文檔

的MySQL 5.7.5和高達器具檢測功能的依賴。如果 的ONLY_FULL_GROUP_BY SQL模式被激活(這是默認設置), MySQL的拒絕爲其選擇列表,HAVING條件,或 ORDER BY列表指的是在 的GROUP BY條款既不叫也不是功能上依賴非聚合列查詢在他們。 (之前 5.7.5,MySQL的沒有檢測功能依賴和ONLY_FULL_GROUP_BY默認情況下不啓用。

要告訴MySQL接受查詢時,您可以使用ANY_VALUE()功能上產生錯誤的字段。

SELECT ANY_VALUE(DATE_FORMAT(`InvoiceDate`,'%Y-%m')) as `formatedInvoiceDate`, 
     ROUND((SUM(`Unit_Cost`*`Quantity`)*`ExchangeRate`)+`VATValue`,2) as `amount` 
FROM `salesinvoice` 
LEFT JOIN `salesinvoice_products` 
    on `salesinvoice`.`SalesInvoice_id`=`salesinvoice_products`.`SalesInvoice_id` 
WHERE `InvoiceDate` < Now() 
    and `InvoiceDate` > DATE_ADD(Now(), INTERVAL- 6 MONTH) 
GROUP BY Month(`InvoiceDate`). 

另外,禁用ONLY_FULL_GROUP_BY

,稍微介紹一下ANY_VALUE()功能可以在MySQL文檔中找到在Miscellaneous Functions(請務必閱讀示例)。

彙總後,當啓用 ONLY_FULL_GROUP_BY SQL模式,針對當MySQL的拒絕一個 查詢,你知道是啥對於MySQL不能確定原因ANY_VALUE()功能是GROUP BY查詢有用。 函數返回值和類型與返回值 及其參數的類型相同,但函數結果未檢查 SQL模式的ONLY_FULL_GROUP_BY

+1

嘿,這工作。你能再解釋一下這個ANY_VALUE的用途嗎? –

+1

@ThomasWilliams您可以檢查[的文檔(https://dev.mysql.com/doc/refman/5.7/en/miscellaneous-functions.html#function_any-value),但它大致做什麼顧名思義:告訴MySQL當它需要在幾個值中進行選擇並且沒有確定性規則時,可以選擇它們中的任何一個。 –

+0

@ThomasWilliams我的建議是檢查ANY_VALUE的例子是爲了瞭解這種情況,你是很棒。非常有趣的問題。 –

1

你ActInvoiceDate是ambygous ..

你不能在使用別名,你應該別名 改名字(你應該在小組使用相同的列)

您的查詢工作罰款之前,因爲以前的版本不檢查是否有列中選擇不對應在group by子句中。並且對於 此列使用firts值dound當需要時

因此您有ExchangeRate,VATValue列不在組中爲此,您可以使用(假)聚合agation函數(在這種情況下,我使用min),因爲很可能這些列具有恆定值

SELECT 
     DATE_FORMAT(`InvoiceDate`,'%Y-%m') as ActInvoiceDate 
     ,ROUND((SUM(`Unit_Cost`*`Quantity`)*min(`ExchangeRate`)+min(`VATValue`),2) as amount 
     FROM `salesinvoice` 
LEFT JOIN `salesinvoice_products` on `salesinvoice`.`SalesInvoice_id`=`salesinvoice_products`.`SalesInvoice_id` 
WHERE `InvoiceDate` < Now() and `InvoiceDate` > DATE_ADD(Now(), INTERVAL- 6 MONTH) 
GROUP BY DATE_FORMAT(`InvoiceDate`,'%Y-%m') 

SELECT 
     DATE_FORMAT(`InvoiceDate`,'%Y-%m') as ActInvoiceDate 
     ,ROUND((SUM(`Unit_Cost`*`Quantity`)*min(`ExchangeRate`))+min(`VATValue`),2) as amount 
     FROM `salesinvoice` 
    LEFT JOIN `salesinvoice_products` on `salesinvoice`.`SalesInvoice_id`=`salesinvoice_products`.`SalesInvoice_id` 
    WHERE `InvoiceDate` < Now() and `InvoiceDate` > DATE_ADD(Now(), INTERVAL- 6 MONTH) 
    GROUP BY ActInvoiceDate 
+0

我的查詢在升級到mysql 5.7之前工作正常,現在不支持。然而,我嘗試了兩個查詢,但仍然收到錯誤#1055 - SELECT列表的表達式#2不在GROUP BY子句中,並且包含非聚集列'salesinvoice.ExchangeRate',它在功能上依賴於GROUP BY子句中的列;這是不符合sql_mode = only_full_group_by –

+0

@ThomasWilliams答案更新.. – scaisEdge

+0

您的第一個代碼運行時出於某種原因在第4行發生錯誤。你的第二個代碼的作品,但給我的價值比我原來的查詢略有不同。這可能是因爲我的原始查詢是錯誤的,但我需要一點時間來檢查這一點,我會告訴你 –

0

FAQ: Server SQL Mode

  • 是對模式依賴於數據庫還是連接?

  • 模式未鏈接到特定數據庫。模式可以在本地設置爲會話(連接),也可以全局爲服務器設置。您 可以使用SET [GLOBAL|SESSION] sql_mode='modes'更改這些設置。

在許多平臺上有可能連接上運行默認查詢。

表示默認模式更嚴格,不再允許不完整的GROUP BY子句,因爲它通常表示查詢錯誤並且結果不正確。

0

您可以使用此語句設置的sql_mode

SET GLOBAL sql_mode="STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"; 
+0

我知道我可以。我已經說過了,但我沒有訪問服務器上的ini文件,所以我想讓我的代碼mysql 5。7合規而不是試圖更改服務器ini文件 –

+0

你不需要在INI文件中只使用這個查詢之前發射查詢像SET GLOBAL sql_mode =「STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION」; SELECT ...... – Sateesh

+0

您仍然需要通過查詢來設置系統範圍值的特殊權限(典型應用程序不應具有的權限)。另外,您無法正確理解整個服務器。 –

相關問題