MySQL 在哪里 ()

Posted

技术标签:

【中文标题】MySQL 在哪里 ()【英文标题】:MySQL WHERE IN () 【发布时间】:2012-04-01 22:30:56 【问题描述】:

我的查询是:

SELECT * FROM table WHERE id IN (1,2,3,4);

我将它用于用户组,并且一个用户可以在多个组中。但似乎当一条记录有多个 id 像 1 和 3 时,mysql 不会返回该行。

有没有什么办法也可以得到该行?

【问题讨论】:

请发布未从该查询正确返回的行的示例。假设您没有将id 存储为逗号分隔的列表或其他内容,则多行从您的查询中返回。 嗯,它是一个逗号分隔的列表,例如 => 3,4 不会被 mySQL 返回。我看到了问题,与逗号有关,但我该怎么做? @user762683,请使用正确的配置文件名称?这个id的数据类型是什么,varchar or set or enum? @Starx 某人使用的个人资料名称是您的什么业务? @Michael,请参阅netcase 而不是 @user762683 对应 OP 的声音有多简单和正确? 【参考方案1】:

您的查询转换为

SELECT * FROM table WHERE id='1' or id='2' or id='3' or id='4';

它只会返回匹配它的结果。


避免复杂性的一种解决方法是将数据类型更改为SET。 然后你可以使用,FIND_IN_SET

SELECT * FROM table WHERE FIND_IN_SET('1', id);

【讨论】:

无法重现任何错误。请求的查询对我有用。我从“表”中获取所有记录,并列出了 id。【参考方案2】:

您的数据库设计有误,您应该花点时间阅读有关数据库规范化的内容 (wikipedia / ***)。

我假设你的桌子看起来有点像这样

表格

group_id user_ids name
1 1,4,6 group1
2 4,5,1 group2

因此,在您的用户组表中,每一行代表一个组,在 user_ids 列中,您有一组分配给该组的用户 ID。

此表的标准化版本如下所示

id name
1 group1
2 group2

GROUP_USER_ASSIGNMENT

group_id user_id
1 1
1 4
1 6
2 4

然后您可以轻松地选择分配了组的所有用户,或组中的所有用户,或所有用户组,或任何您能想到的。此外,您的 sql 查询将起作用:

/* Your query to select assignments */
SELECT * FROM `group_user_assignment` WHERE user_id IN (1,2,3,4);

/* Select only some users */
SELECT * FROM `group_user_assignment` t1
JOIN `group` t2 ON t2.id = t1.group_id
WHERE user_id IN (1,4);

/* Select all groups of user */
SELECT * FROM `group_user_assignment` t1
JOIN `group` t2 ON t2.id = t1.group_id
WHERE t1.`user_id` = 1;

/* Select all users of group */
SELECT * FROM `group_user_assignment` t1
JOIN `group` t2 ON t2.id = t1.group_id
WHERE t1.`group_id` = 1;

/* Count number of groups user is in */
SELECT COUNT(*) AS `groups_count` FROM `group_user_assignment` WHERE `user_id` = 1;

/* Count number of users in group */
SELECT COUNT(*) AS `users_count` FROM `group_user_assignment` WHERE `group_id` = 1;

这样更新数据库也更容易,当你想添加新的赋值时,你只需在group_user_assignment中插入新行,当你想删除赋值时,你只需删除group_user_assignment中的行。

在您的数据库设计中,要更新作业,您必须从数据库中获取作业集,对其进行处理和更新,然后再写回数据库。

这里有sqlFiddle 可以玩。

【讨论】:

【参考方案3】:

你必须在数据库中有表记录或数组记录。

示例:

SELECT * FROM tabel_record
WHERE table_record.fieldName IN (SELECT fieldName FROM table_reference);

【讨论】:

不需要子选择。 IN (1,2,3,4) 完全有效。另外,我不明白这如何解释问题中的“当记录具有多个 id (如 1 和 3)时,mySQL 不会返回该行”。

以上是关于MySQL 在哪里 ()的主要内容,如果未能解决你的问题,请参考以下文章

MySQL在哪里存在,mySQL如何链接行?

我在哪里可以找到 XAMPP 中的 MySQL 日志文件

选择在哪里 - mySQL

mysql报警日志文件位置在哪里?

在哪里可以找到 MySQL InnoDB 集群名称

mysql错误日志在哪里