MYSQL グループ化における奇妙な動作
概要
説明列のあるトランザクション表があります。テスト中に、異常な動作を観察しました。 別の取引では「Circle K Skövde」と「Circle K Skovde」という完全に類似した記述はありませんでした。 group_by クエリを実行すると、「Circle K Skövde」の説明は見つかりませんでしたが、「Circle K Skovde」トランザクションのみが見つかりました。 そこで、金額が「Circle K Skövde」の説明を持つトランザクションからのものである別の金額フィルターを追加しました。今度は正しい説明が返されました。
私のアプリケーションは Ruby on Rails フレームワーク上で実行され、MYSQL データベースを使用します。最初に思ったのは、これは Rails によるものですが、MYSQL ワークベンチでは同じように動作しているということです。これは、MYSQL が原因であることを意味します。
以下は SQL クエリです。
SELECT
SUM(`Transaction`.`amount`) AS sum_amount,
`Transaction`.`original_description` collate utf8mb3_bin transaction_original_description,
`Transaction`.`category_id` AS transaction_category_id,
CAST(DATE_FORMAT(CONVERT_TZ(`Transaction`.`transaction_at`,
'+00:00',
'Etc/UTC'),
'%Y-%m-01')
AS DATE) AS cast_date_format_convert_tz_transaction_transaction_at_00_00_etc_utc_y_m_01_as_date
FROM
`Transaction`
INNER JOIN
`Account` ON `Account`.`id` = `Transaction`.`account_id`
INNER JOIN
`Provider` ON `Provider`.`id` = `Account`.`provider_id_id`
INNER JOIN
`UserDetail` ON `UserDetail`.`id` = `Provider`.`user_detail_id`
INNER JOIN
`categories` ON `categories`.`id` = `Transaction`.`category_id`
INNER JOIN
`categories` `parents_categories` ON `parents_categories`.`id` = `categories`.`parent_category_id`
WHERE
`UserDetail`.`raw_response_id` = 'cf0cc9dfb9dd481d8682e7a41e8c3068'
AND (transaction_at >= '2022-11-01 00:00:00')
AND `parents_categories`.`transaction_type` = 'expenses'
AND `parents_categories`.`parent_category_id` IS NULL
AND `Transaction`.`id` != 'mysql_temporary_query_fix'
AND (`Transaction`.`transaction_at` >= '2022-11-01 00:00:00'
AND `Transaction`.`transaction_at` <= '2023-11-01 09:24:39.198035')
GROUP BY `Transaction`.`original_description` , `Transaction`.`category_id` , CAST(DATE_FORMAT(CONVERT_TZ(`Transaction`.`transaction_at`,
'+00:00',
'Etc/UTC'),
'%Y-%m-01')
AS DATE);
これに対する解決策はありますか? 前もって感謝します。
解決策
他の人が述べたように、これは照合設定が原因です。
「Skövde」と「Skovde」は異なる単語であるため、別個に扱いました。
クエリ自体もサンプル データセットも示していないため、クエリ結果についてコメントするのは困難ですが、一般に、照合設定がすべての要素 (サーバー設定 (サーバー、データベース、テーブル、列)) にわたって意味をなすものであることを確認してください。およびクライアント設定 (RoR)。