php - MYSQL 5.5 到 MARIADB 10.0 = 非分组字段 'x' 用于 HAVING 子句

标签 php mysql

我不是一个好的程序员,我试图帮助一个 friend 将网站迁移到新主机。

有人可以帮我解决这个问题。我尝试用“WHERE”改变“HAVING”。但没有工作。我可以在 mariadb 配置中添加一些东西来支持它吗?

Non-grouping field 'invoice_status' is used in HAVING clause

SELECT SQL_CALC_FOUND_ROWS fi_invoice_custom.*, fi_client_custom.*, fi_user_custom.*, fi_users.user_name, fi_users.user_company, fi_users.user_address_1, fi_users.user_address_2, fi_users.user_city, fi_users.user_state, fi_users.user_zip, fi_users.user_country, fi_users.user_phone, fi_users.user_fax, fi_users.user_mobile, fi_users.user_email, fi_users.user_web, fi_clients.*, fi_invoice_amounts.invoice_amount_id, 

IFNULL(fi_invoice_amounts.invoice_item_subtotal, '0.00') AS invoice_item_subtotal, 
IFNULL(fi_invoice_amounts.invoice_item_tax_total, '0.00') AS invoice_item_tax_total, 
IFNULL(fi_invoice_amounts.invoice_tax_total, '0.00') AS invoice_tax_total, IFNULL(fi_invoice_amounts.invoice_total, '0.00') AS invoice_total, 
IFNULL(fi_invoice_amounts.invoice_paid, '0.00') AS invoice_paid, 
IFNULL(fi_invoice_amounts.invoice_balance, '0.00') AS invoice_balance, DATEDIFF(NOW(), invoice_date_due) AS days_overdue, 

(CASE WHEN (fi_invoices.invoice_id not in (select invoice_id from fi_payments where payment_done=1) 
and invoice_balance > 0) THEN 'Overdue' WHEN (fi_invoices.invoice_id IN (SELECT invoice_id from fi_payments where payment_done=1) 
and invoice_balance > 0) THEN 'Open' WHEN (invoice_balance = 0 and invoice_total > 0) THEN 'Closed' ELSE 'Unknown' END) AS invoice_status, 

(CASE (SELECT COUNT(*) FROM fi_invoices_recurring WHERE fi_invoices_recurring.invoice_id = fi_invoices.invoice_id 
and fi_invoices_recurring.recur_next_date <> '0000-00-00') WHEN 0 THEN 0 ELSE 1 END) AS invoice_is_recurring, fi_invoices.* FROM (`fi_invoices`) 

JOIN `fi_clients` ON `fi_clients`.`client_id` = `fi_invoices`.`client_id` 
JOIN `fi_users` ON `fi_users`.`user_id` = `fi_invoices`.`user_id` 
LEFT JOIN `fi_invoice_amounts` ON `fi_invoice_amounts`.`invoice_id` = `fi_invoices`.`invoice_id` 
LEFT JOIN `fi_client_custom` 
ON `fi_client_custom`.`client_id` = `fi_clients`.`client_id` 
LEFT JOIN `fi_user_custom` ON `fi_user_custom`.`user_id` = `fi_users`.`user_id` 
LEFT JOIN `fi_invoice_custom` ON `fi_invoice_custom`.`invoice_id` = `fi_invoices`.`invoice_id` WHERE `idcompagnie` = 1 
HAVING `invoice_status` = 'Overdue' 
ORDER BY `fi_invoices`.`invoice_date_created` DESC LIMIT 15

谢谢

最佳答案

您在 MySQL 中使用了一个“hack”,可以通过 case 表达式的别名进行过滤。在具有更严格的 SQL 语法规则的数据库中,这是不允许的。

我认为最简单的解决方法是将您现有的查询视为“派生表”,然后将 having 子句转换为 where 子句,紧跟在 之后子查询,它使您能够通过别名 引用派生列。

SELECT *
FROM (
      SELECT SQL_CALC_FOUND_ROWS fi_invoice_custom.*, fi_client_custom.*, fi_user_custom.*, fi_users.user_name, fi_users.user_company, fi_users.user_address_1, fi_users.user_address_2, fi_users.user_city, fi_users.user_state, fi_users.user_zip, fi_users.user_country, fi_users.user_phone, fi_users.user_fax, fi_users.user_mobile, fi_users.user_email, fi_users.user_web, fi_clients.*, fi_invoice_amounts.invoice_amount_id, 

      IFNULL(fi_invoice_amounts.invoice_item_subtotal, '0.00') AS invoice_item_subtotal, 
      IFNULL(fi_invoice_amounts.invoice_item_tax_total, '0.00') AS invoice_item_tax_total, 
      IFNULL(fi_invoice_amounts.invoice_tax_total, '0.00') AS invoice_tax_total, IFNULL(fi_invoice_amounts.invoice_total, '0.00') AS invoice_total, 
      IFNULL(fi_invoice_amounts.invoice_paid, '0.00') AS invoice_paid, 
      IFNULL(fi_invoice_amounts.invoice_balance, '0.00') AS invoice_balance, DATEDIFF(NOW(), invoice_date_due) AS days_overdue, 

      (CASE WHEN (fi_invoices.invoice_id not in (select invoice_id from fi_payments where payment_done=1) 
      and invoice_balance > 0) THEN 'Overdue' WHEN (fi_invoices.invoice_id IN (SELECT invoice_id from fi_payments where payment_done=1) 
      and invoice_balance > 0) THEN 'Open' WHEN (invoice_balance = 0 and invoice_total > 0) THEN 'Closed' ELSE 'Unknown' END) AS invoice_status, 

      (CASE (SELECT COUNT(*) FROM fi_invoices_recurring WHERE fi_invoices_recurring.invoice_id = fi_invoices.invoice_id 
      and fi_invoices_recurring.recur_next_date <> '0000-00-00') WHEN 0 THEN 0 ELSE 1 END) AS invoice_is_recurring, fi_invoices.* FROM (`fi_invoices`) 

      JOIN `fi_clients` ON `fi_clients`.`client_id` = `fi_invoices`.`client_id` 
      JOIN `fi_users` ON `fi_users`.`user_id` = `fi_invoices`.`user_id` 
      LEFT JOIN `fi_invoice_amounts` ON `fi_invoice_amounts`.`invoice_id` = `fi_invoices`.`invoice_id` 
      LEFT JOIN `fi_client_custom` 
      ON `fi_client_custom`.`client_id` = `fi_clients`.`client_id` 
      LEFT JOIN `fi_user_custom` ON `fi_user_custom`.`user_id` = `fi_users`.`user_id` 
      LEFT JOIN `fi_invoice_custom` ON `fi_invoice_custom`.`invoice_id` = `fi_invoices`.`invoice_id` WHERE `idcompagnie` = 1
      ) d
WHERE d.`invoice_status` = 'Overdue' 
ORDER BY d.`invoice_date_created` DESC 
LIMIT 15
;

但还要注意子查询有一个别名,所以也要根据细节更改顺序

关于php - MYSQL 5.5 到 MARIADB 10.0 = 非分组字段 'x' 用于 HAVING 子句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46572464/

相关文章:

php - 如何在 Cpanel 中使用 Cron 处理发送电子邮件限制?

PHP 声称定义的数组索引未定义

php - 如何更改 "post comment"按钮上的文本?

python - Django View 查询和外键查找

php - 查询没有从表中获取数据

mysql - 选择所有并作为 MYSQL 查询

php - sql BEGIN 创建错误

javascript - cURL 使用 php 发布数据

mysql - 如何确保在递增字段时 MySQL 数据库中没有竞争条件?

php - 选择 "enabled"行加上当前选中的行