函数的作用是:跳过集合中的一项

qkf9rpyu  于 2021-06-21  发布在  Mysql
关注(0)|答案(1)|浏览(308)

我对mysql find \u in \u set()函数有一个非常奇怪的问题。三张table,如下所示。底部的查询将查找其职位在特定活动的“活动\关联”中列出的所有用户。换句话说:“哪些人有这个活动?”。
它应该找到所有三个用户;但由于某些原因,它跳过了中间的位置,只返回用户1和3(实际数据有更多的人。很明显,它跳过了一个特定的位置——就好像“dop”不在列表中一样 activity_assoc . positions .)
用户\u主机

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\u in\u set行更改为以下内容,它可以正常工作。

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

更新:下面的部分现在已修复:
你可能注意到了 cast() 功能。如果我不这样做,我会得到一个“非法混合排序规则”的错误。数据库中的大多数表都是 utf8_general_ci ,但activity\u assoc表 utf8_unicode_ci . 我昨天在其中运行了以下程序来尝试修复此问题:

ALTER TABLE `activity_assoc` COLLATE `utf8_general_ci`;

mysql工作台中的表检查器现在显示为 utf8_general_ci 排序规则,但实际上运行查询的行为似乎仍然是 utf8_unicode_ci . (需要说明的是:表检查器当前显示所有三个表 utf8_general_ci 我不知道这是两个独立的问题还是同一个问题。

biswetbf

biswetbf1#

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

相关问题