2017-10-04 8 views
1

私は良いプログラマーではありません、私は新しいホストにウェブサイトを移動する友人を助けようとしています。MYSQL 5.5 to MARIADB 10.0 =グループ化されていないフィールド 'x'がHAVING節で使用されています

誰かがそれを解決するのを手助けすることができます。私は "HAVING"を "WHERE"に変更しようとしています。しかし、働いていない。私はそれをサポートするためにmariadb設定で何かを追加することはできますか? case式の別名でフィルタリングを有効にするには、MySQLの中で「ハック」を使用している

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 

おかげ

+1

有する基句を必要とします。それはあなたが得ているエラーです。 – LordNeo

+0

しかし、このコードは、mariaDB 10.0ではなくmysql 5.5上で正常に動作します。あなたはもう少し説明して、簡単な例を教えてください。 –

+1

@LordNeoが指摘するように、あなたの質問は悪いです。 MySQLの特定のバージョン/設定はいくつかのことを滑らせますが、間違っていたり、* do *気になるバージョン/設定を壊すことはありません。集計関数の結果ではないフィールドに対しては 'HAVING'を使用することはできません。また、' GROUP BY'節を使用しない場合は有用ではありません。それがあなたに何も意味しない場合は、そのクエリで 'HAVING'を' AND'に置き換えればうまくいくはずです。 – Sammitch

答えて

0

。これは、SQL構文の規則が厳密なデータベースでは許可されません。

私が考える最も簡単な回避策は、「派生テーブル」と、既存のクエリを処理し、そのhaving句を使用すると、aliasによって派生列を参照することができますどのsubqueryを次の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 
; 

もサブクエリがエイリアスを取得することに注意してくださいので、詳細順を変更するだけでなく

関連する問題