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 在哪里 ()的主要内容,如果未能解决你的问题,请参考以下文章