only_full_group_by 不让我显示我想要的 table

only_full_group_by not letting me show a table as I want

我有一个新的 VPS 服务器,MySQL 服务器版本为 5.7.27。在这个新的 VPS 中,我上传了一个数据库和一些代码,这些代码来自我以前的服务器,该服务器具有更旧的 MySQL 服务器版本。

MySQL 服务器版本 5.7.27 默认启用 only_full_group_by。 当在新的 VPS 服务器中出现问题时,我正在尝试 运行 包含 GROUP BY 语句的查询,该语句曾经在我的旧服务器中工作但现在在新服务器中我收到以下消息.

1055:SELECT 列表的表达式 #1 不在 GROUP BY 子句中并且包含非聚合列 'ihrwpmmy_loyal.i.id',它在功能上不依赖于 GROUP BY 子句中的列;这与 sql_mode=only_full_group_by

不兼容

我知道有 removing/disabling only_full_group_by 选项,但我想正确地做事并更正我的查询。

我一直在阅读,我了解到将 i.id 添加到 GROUP BY 语句将再次显示 table 中的值,但是我真的不想 GROUP BY i.id 相反我只想 GROUP BY i.loadNumber 但我是被迫 GROUP BY i.id 以消除错误。我真的也需要 GROUP BY i.loadNumber 因为我不想在 table.

上显示重复的负载编号
SELECT i.id AS ivoiceIDAOC,
        i.debtorId,
        i.loadNumber,
        i.amountUsd,
        i.sentDate,
        i.commissionStatus,
        i.paidDate,
        i.status,
        cp.amountUsd AS amountUsdCarriersPayments,
        i.amountUsd - SUM(cp.amountUsd) AS companyProfitUsd,
        ROUND((i.amountUsd - SUM(cp.amountUsd)) * 0.10, 2) AS salesRepProfitUsd,
        ROUND(((i.amountUsd - SUM(cp.amountUsd)) * 0.10) * 0.50, 2)  AS advanceOnCommissionUsd,
        l.id,
        l.clientName,
        l.repID
        FROM invoice i
        LEFT OUTER JOIN leads l ON i.debtorId = l.id
        INNER JOIN carriersPayments cp ON cp.loadNumber LIKE CONCAT('', i.loadNumber, '%')
        WHERE True
        ".$filter_AOC_date."
        ".$filter_AOC_salesRep."
        AND i.commissionStatus IS NULL
        GROUP BY
        i.id,
        i.loadNumber,
        cp.amountUsd
        ORDER BY i.id desc";

这就是 table 的样子。

Load #|Customer Name| Paid Date |Revenue| Cost |Co Profit|SR Profit | AOC  |
------+-------------+-----------+-------+------+--------------------+------+
1570  | Customer 1  | 2019-09-19| 0  |   |      |        | .5 |
1565  | Customer 2  | 2019-09-17| 2  |   |      |   .2   | .6 |
1565  | Customer 2  | 2019-09-16| 4  |   |      |   .4   | .7 |
1566  | Customer 3  | 2019-09-13| 6  |   |      |   .6   | .8 |

正如您在示例 table 中看到的那样,如果我被迫将 i.id 添加到我的 GROUP BY 语句中,我将获得负载编号 1565两次.
我只想看到不同的负载数。

Load #|Customer Name| Paid Date |Revenue| Cost |Co Profit|SR Profit | AOC  |
------+-------------+-----------+-------+------+--------------------+------+
1570  | Customer 1  | 2019-09-19| 0  |   |      |        | .5 |
1565  | Customer 2  | 2019-09-17| 6  | 0 |   6  |   .6  | .3 |
1566  | Customer 3  | 2019-09-13| 6  |   |      |   .6   | .8 |

您在 select 某些列中未涉及聚合函数且未在组中提及此默认情况下不允许用于最新版本 mysql

此外,您还在 select 和聚合函数中使用了同一列,这很奇怪,您不能使用其中之一,似乎没有意义

根据您的代码,您可以使用适当的子查询重构您的查询

select loadNumber, SUM(amountUsd) sum_usd, SUM(amountCad) sum_cad
from  carriersPayments
group by loadNumber 

示例:

"SELECT i.id AS ivoiceIDAOC,
        i.debtorId,
        i.loadNumber,
        i.amountUsd,
        i.amountCad,
        i.sentDate,
        i.commissionStatus,
        i.paidDate,
        i.status,
        cp.amountUsd AS amountUsdCarriersPayments,
        cp.amountCad AS amountCadCarriersPayments,

        i.amountUsd - sum_usd AS companyProfitUsd,
        i.amountCad - sum_cad AS companyProfitCad,

        ROUND((i.amountUsd - sum_usd) * 0.10, 2) AS salesRepProfitUsd,
        ROUND((i.amountCad - sum_cad) * 0.10, 2) AS salesRepProfitCad,

        ROUND(((i.amountUsd - sum_usd) * 0.10) * 0.50, 2)  AS advanceOnCommissionUsd,
        ROUND(((i.amountCad - sum_cad) * 0.10) * 0.50, 2)  AS advanceOnCommissionCad,

        l.id,
        l.clientName,
        l.repID
        FROM invoice i
        INNER JOIN carriersPayments cp ON cp.loadNumber LIKE CONCAT('', i.loadNumber, '%')
        INNER JOIN  (
          select loadNumber, SUM(amountUsd) sum_usd, SUM(amountCad) sum_cad
          from  carriersPayments
          group by loadNumber 
          ) t ON t.loadNumber LIKE CONCAT('', i.loadNumber, '%')
        LEFT OUTER JOIN leads l ON i.debtorId = l.id
        WHERE True
        ".$filter_AOC_date."
        ".$filter_AOC_salesRep."
        AND i.commissionStatus IS NULL
        ORDER BY i.id desc";    

最后你不应该在 sql 中使用 php var 这对 sqlinject 有风险.. 为了避免这种情况你应该看看你的数据库驱动程序是否准备好了声明和绑定参数。