MYSQL分组中的奇怪行为

MYSQL Weird behaviour in grouping

提问人:Aditya Gadekar 提问时间:11/2/2023 最后编辑:Aditya Gadekar 更新时间:11/6/2023 访问量:41

问:

我有带有描述列的发生业务表。在测试过程中,我观察到一种不寻常的行为。 在不同的交易中没有完全相似的描述。当我运行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);

有什么解决办法吗? 提前致谢。

MySQL 的Ruby-on-Rails Ruby

评论

2赞 Shadow 11/2/2023
可能是排序规则问题。当您进行分组依据时,您必须使用无法区分同一字符的重音版本和无重音版本的排序规则。
0赞 Akina 11/2/2023
检查会话和表排序规则设置。取决于排序规则,您的值是否相等: dbfiddle.uk/3x6a6G2Q 如果不确定会话设置是否正确,请在查询中指定所需的排序规则。
0赞 Aditya Gadekar 11/3/2023
是的,这是一个排序规则问题。当使用 COLLATE utf8mb4_bin 运行查询时,它会给出正确的结果。现在想办法,将 COLLATE 与 rails ORM 一起使用。如果您对此有所了解,请提出建议。
0赞 engineersmnky 11/3/2023
@AdityaGadekar请发布您打算运行的 SQL,我们可以帮助您将其转换为 Arel 以用于 rails ORM。例如:将生成Arel::Nodes::InfixOperation('COLLATE',MyModel.arel_table[:description],Arel.sql('utf8mb4_bin'))my_models.description COLLATE utf8mb4_bin

答:

0赞 Severalnines 11/3/2023 #1

正如其他人所提到的,这是由排序规则设置引起的。

“Skövde”和“Skovde”是不同的词,因此将它们分开处理。

很难对查询结果进行评论,因为您既没有显示查询本身,也没有显示示例数据集,但通常,请确保排序规则设置在所有元素(服务器设置(服务器、数据库、表、列)和客户端设置 (RoR))中都有意义。