我对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
我不知道这是两个独立的问题还是同一个问题。
1条答案
按热度按时间biswetbf1#
@billkarwin解决了我遇到的一个问题,在我手动更改记录后,find\u in \u set()无法正常工作的主要问题突然开始工作(可能不是第一次)。无法说明原因或方式—数据库或系统级别出现某种故障:-/