gpt4 book ai didi

MySQL find_in_set() 函数跳过集合中的一项

转载 作者:行者123 更新时间:2023-11-29 18:01:07 24 4
gpt4 key购买 nike

我在使用 MySQL find_in_set() 函数时遇到了一个非常奇怪的问题。三张表,如下。底部的查询正在查找其职位在特定事件的 Activity_assoc 中列出的所有用户。换句话说:“哪些人有此事件?”。

应该找到所有三个用户;但由于某种原因,它跳过了中间的位置,只返回用户 1 和 3。(实际数据有更多人。它显然跳过了特定位置 - 就好像“DOP”不在 的列表中一样Activity_assoc.位置。)

用户主控

id    first_name        last_name        position_id
-----------------------------------------------------------
1 Eblis O'Shaugnessy 13
2 JimmyJojo Shamadou 20
3 Bob Justbob 25

职位

id    position              abbreviation
---------------------------------------------
13 Director of Stuff DOS
20 Director of Peoples DOP
25 Director of Ideas DOI

事件关联

id    activity              positions
----------------------------------------------
47 Make Things Happen DOS,DOP,DOI
SELECT DISTINCT `users`.`id`, `users`.`first_name`, `last_name`, `position`, `activity_assoc`.`positions`
FROM `activity_assoc`,
(
SELECT `users_master`.*, `positions`.`abbreviation` AS `position`
FROM `users_master` LEFT JOIN `positions` ON `users_master`.`position_id` = `positions`.`id`
) AS `users`
WHERE
`activity_assoc`.`activity` = 'Make Things Happen' AND
find_in_set( `users`.`position`, `activity_assoc`.`positions` )

如果我将 find_in_set 行更改为以下内容,则效果很好。

`users`.`position` IN ( 'DOS','DOP','DOI' )

更新:以下部分现已修复:

您可能已经注意到 cast()函数。如果我不这样做,我会收到“非法混合排序规则”错误。数据库中的大多数表都是 utf8_general_ci,但 Activity_assoc 表是 utf8_unicode_ci。我昨天在其中运行了以下命令来尝试解决此问题:

ALTER TABLE `activity_assoc` COLLATE `utf8_general_ci`;

MySQL Workbench 中的表检查器现在将其显示为 utf8_general_ci 排序规则,但实际运行查询似乎仍然是 utf8_unicode_ci 。 (需要明确的是:Table Inspector 目前显示所有三个表都是 utf8_general_ci 排序规则。)我无法判断这是两个单独的问题还是同一个问题。

最佳答案

@BillKarwin 解决了我遇到的一个问题,并且 find_in_set() 无法正常工作的主要问题在我手动更改记录后突然开始工作(可能不是第一次)。无法说出原因或方式——数据库或系统级别出现某种故障。 :-/

关于MySQL find_in_set() 函数跳过集合中的一项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48328296/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com