我在使用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
校对。)我不知道这些是两个独立的问题还是同一个问题。
答案 0 :(得分:0)
@BillKarwin解决了我遇到的一个问题,并且我手动修改记录后,find_in_set()工作不正常的主要问题突然开始工作(可能不是第一次)。不能说出为什么或如何 - 在数据库或系统级别出现某种故障。 : - /