EXPLAIN SELECT COUNT(*)
FROM BILL_PATIENT_BILL AS fetchInfo
WHERE IF(fetchInfo.BILL_TYPE='OP'
AND fetchInfo.BILL_CATEGORY=0,fetchInfo.DUE_AMOUNT != 0,TRUE)
あなたのIFは意味がありません。それがすることは次のとおりです。
- BILL_TYPE='OP' の場合、
- および BILL_CATEGORY=0、
- DUE_AMOUNT != 0 の場合、where 節は true になります。
- それ以外の場合、where 句は常に true です。
とにかく、あなたはそれを必要としません。De Morganを使用して、このようにクエリを書き直すことができます
EXPLAIN SELECT COUNT(*)
FROM BILL_PATIENT_BILL AS fetchInfo
WHERE (fetchInfo.BILL_TYPE='OP'
AND fetchInfo.BILL_CATEGORY=0
AND fetchInfo.DUE_AMOUNT != 0)
OR fetchInfo.BILL_TYPE<>'OP'
OR fetchInfo.BILL_CATEGORY=0
(BILL_TYPE,BILL_CATEGORY,DUE_AMOUNT) に 1 つのインデックスを設定する必要がありますが、それでも OR 句を使用すると、インデックスを使用しないと判断される場合があります。その場合は、共用体として書き直してみてください。
SELECT COUNT(*)
FROM BILL_PATIENT_BILL AS fetchInfo
WHERE (fetchInfo.BILL_TYPE='OP'
AND fetchInfo.BILL_CATEGORY=0
AND fetchInfo.DUE_AMOUNT != 0)
UNION ALL
SELECT COUNT(*)
FROM BILL_PATIENT_BILL AS fetchInfo
WHERE fetchInfo.BILL_TYPE<>'OP'
UNION ALL
SELECT COUNT(*)
FROM BILL_PATIENT_BILL AS fetchInfo
WHERE fetchInfo.BILL_CATEGORY=0
それらを追加するためにSUMを実行できます。
実際には列のすべての値を受け入れているので、where句さえ必要ないかもしれません...
EXPLAIN SELECT COUNT(
IF(fetchInfo.BILL_TYPE='OP'
AND fetchInfo.BILL_CATEGORY=0
AND fetchInfo.DUE_AMOUNT != 0,
1,
0))
FROM BILL_PATIENT_BILL AS fetchInfo