提问人:Aditya Gadekar 提问时间:11/2/2023 最后编辑:Aditya Gadekar 更新时间:11/6/2023 访问量:41
MYSQL分组中的奇怪行为
MYSQL Weird behaviour in grouping
问:
我有带有描述列的发生业务表。在测试过程中,我观察到一种不寻常的行为。
在不同的交易中没有完全相似的描述。当我运行group_by查询时,我找不到描述,只有事务。
因此,我添加了另一个金额过滤器,其中金额来自带有描述的交易,这次它返回了正确的描述。"Circle K Skövde"
"Circle K Skovde"
"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);
有什么解决办法吗? 提前致谢。
答:
0赞
Severalnines
11/3/2023
#1
正如其他人所提到的,这是由排序规则设置引起的。
“Skövde”和“Skovde”是不同的词,因此将它们分开处理。
很难对查询结果进行评论,因为您既没有显示查询本身,也没有显示示例数据集,但通常,请确保排序规则设置在所有元素(服务器设置(服务器、数据库、表、列)和客户端设置 (RoR))中都有意义。
评论
Arel::Nodes::InfixOperation('COLLATE',MyModel.arel_table[:description],Arel.sql('utf8mb4_bin'))
my_models.description COLLATE utf8mb4_bin