I'm not a good programmer, i try to help a friend that move is website to new host.
Someone can help me to fix that. I try to change "HAVING" with "WHERE". But not working. Can i add something in the mariadb config to support that?
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
Thanks
You have used a "hack" in MySQL that enable filtering by the alias of a case expression. This isn't allowed in databases with tighter rules of SQL syntax.
The easiest workaround I think is to treat your existing query as a "derived table" and then convert that having
clause into a where
clause that follows the subquery
which enables you to reference the derived column by the alias
.
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
;
but also note that the subquery gets an alias, so change the order by details as well
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.