一貫性のない MySQL クエリ結果
P粉514458863
2023-08-15 21:47:39
<p>特定の支払いシステムで行われたトランザクションを保持する「トランザクション」というテーブルがあります。
(たとえば) 2023 年 7 月の日次レポートを取得したいと考え、次のクエリを実行しました。 </p>
<pre class="brush:sql;toolbar:false;">SELECT DAY(CREATED), count(*) FROM `transaction`
WHERE STATUS = '承認済み' AND MONTH(CREATED) = 07 AND YEAR(CREATED) = 2023
日別グループ(作成)
</pre>
<p>結果が数日スキップされます。たとえば、月の 7 日の場合は何も得られませんが、クエリを次のように変更すると、</p>
<pre class="brush:sql;toolbar:false;">SELECT DAY(CREATED), count(*) FROM `transaction`
WHERE STATUS = '承認済み' AND MONTH(CREATED) = 07 AND YEAR(CREATED) = 2023 AND DAY(CREATED) = 7
日ごとにグループ化(作成);
</pre>
<p> (基本的に <code>DAY(CREATED) = 7</code> をクエリに追加します)</p>
<p>7日目のカウントを返します。</p>
<p>なぜ矛盾しているのでしょうか?
最初のクエリでこの問題を解決するにはどうすればよいでしょうか? </p>
<p>よろしくお願いします:)</p>
<p>編集:
テーブル構造とデータの例: </p>
<pre class="brush:sql;toolbar:false;">CREATE TABLE `transaction` (
`ID` int NOT NULL、
`PLATFORM_ID` int NOT NULL、
`ENTITY_ID` int NOT NULL、
`RELATED_TRANSACTION_ID` int NOT NULL DEFAULT '0',
`ORIGIN_ID` varchar(120) NOT NULL、
`BANK` varchar(64) デフォルト NULL、
`AMOUNT` double NOT NULL、
`CURRENCY` varchar(3) NOT NULL、
`TYPE` varchar(2) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL、
`CREATED` 日時が NULL ではありません。
`CARD_NO` varchar(20) デフォルト NULL、
`CARD_BRAND` varchar(45) デフォルト NULL、
`CARD_EXPIRE_YEAR` int DEFAULT NULL,
`CARD_EXPIRE_MONTH` varchar(45) デフォルト NULL、
`HOLDER_NAME` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
`EMAIL` varchar(256) デフォルト NULL、
`STATUS` enum('approved','declined','filtered','pending') CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
`IS_3D` tinyint(1) デフォルト NULL、
`CREATED_AT` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP、
`AMOUNTEUR` double DEFAULT NULL、
`IS_FRAUD` tinyint(1) NOT NULL デフォルト '0'、
`FRAUD_DATE` 日付 DEFAULT NULL、
`KYC_DATE` 日時 DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
</pre>
<p>挿入例: </p>
<pre class="brush:sql;toolbar:false;">INSERT INTO `transaction` (`ID`, `PLATFORM_ID`, `ENTITY_ID`, `RELATED_TRANSACTION_ID`, `ORIGIN_ID`, `BANK`, `AMOUNT` 、`CURRENCY`、`TYPE`、`CREATED`、`CARD_NO`、`CARD_BRAND`、`CARD_EXPIRE_YEAR`、`CARD_EXPIRE_MONTH`、`HOLDER_NAME`、`EMAIL`、`STATUS`、`IS_3D`、`CREATED_AT`、` AMOUNTEUR`、`IS_FRAUD`、`FRAUD_DATE`、`KYC_DATE`) 値
(1, 1, 87, 0, '219114359', 'SOME BANK', 150, 'USD', 'DB', '2022-02-01 00:00:17', '000000XXXXXX0000', 'MasterCard', 2025 、'06'、'NAME FAMILY'、'aaaaaaaa@gmail.com'、'承認済み'、0、'2022-08-25 13:12:58'、150.7605、0、NULL、NULL);
</pre>
<p>この場合は関係ないと思われるため、インデックス定義を省略しました。 </p>
MySQL コンソールで実行した後、問題が見つかりました。理由は非常に単純です。PhpMyAdmin システムは表示を 25 行にのみ制限しています...
###これは私のせいだ! :O 皆さん、お時間とサポートをしていただき、本当にありがとうございました!