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

时间:2018-01-18 18:46:37

标签: mysql sql

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

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

users_master

positions

位置

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

activity_assoc

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

如果我将find_in_set行更改为以下内容,则可以正常工作。

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` )

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

你可能已经注意到了`users`.`position` IN ( 'DOS','DOP','DOI' ) 功能。如果我离开它,我会得到“非法混合排序”错误。数据库中的大多数表都是cast(),但activity_assoc表是utf8_general_ci。我昨天在其中运行了以下内容以尝试解决此问题:

utf8_unicode_ci

MySQL Workbench中的表格检查器现在将其显示为ALTER TABLE `activity_assoc` COLLATE `utf8_general_ci`; 排序规则,但实际运行查询似乎表现为仍然utf8_general_ci。 (需要明确的是:Table Inspector目前显示所有三个表都是utf8_unicode_ci校对。)我不知道这些是两个独立的问题还是同一个问题。

1 个答案:

答案 0 :(得分:0)

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