MySQL WHERE IN ()

13 浏览
0 Comments

MySQL WHERE IN ()

我的问题是:

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

我将其用于用户组,一个用户可以属于多个组。但是当一条记录有多个id,比如1和3时,MySQL不会返回该行。

有没有办法也能获取到这行数据?

0
0 Comments

MySQL WHERE IN ()问题的出现原因是数据库设计存在问题,需要进行数据库规范化的学习。数据库规范化是一种将关系数据库设计的过程,旨在消除数据冗余并提高数据的一致性和完整性。

假设表格的结构如下所示:

TABLE

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

在用户组的表格中,每一行代表一个组,而user_ids列中包含了分配给该组的用户ID集合。

对于这个问题,我们可以通过规范化数据库表结构来解决。规范化后的表格如下所示:

GROUP

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上进行实验。

通过对数据库进行规范化,可以提高数据管理的效率和灵活性,并且减少数据冗余和错误。规范化是数据库设计中的重要概念,值得深入学习和应用。

0
0 Comments

MySQL中的WHERE IN()语句是一种常用的查询方法,它允许我们在WHERE条件中使用多个值进行匹配。然而,有时候使用WHERE IN()语句可能会出现一些问题,下面我们来分析一下出现这个问题的原因以及解决方法。

原因:

在使用WHERE IN()语句时,如果要查询的值较多,那么WHERE条件中可能会出现很长的字符串,这样会导致查询语句变得复杂,不易维护和调试。此外,使用WHERE IN()语句还可能会遇到一些性能问题,特别是当查询的表数据量较大时,可能会导致查询速度变慢。

解决方法:

为了避免WHERE IN()语句的复杂性,我们可以考虑将数据类型更改为SET类型,然后使用FIND_IN_SET函数进行查询。FIND_IN_SET函数可以在SET类型的字段中查找指定的值,并返回其在SET中的位置。

下面是使用FIND_IN_SET函数的示例查询语句:

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

另外,有人可能会考虑使用位域(bitfield)来解决这个问题。位域是一种多值属性,类似于CSV列,但是以二进制形式存储。然而,并不推荐使用位域,因为它是一种反模式,不利于排序、搜索和更新操作。

在使用MySQL中的WHERE IN()语句时,如果遇到查询条件较多或性能较慢的情况,可以考虑将数据类型更改为SET类型,并使用FIND_IN_SET函数进行查询。避免使用位域来解决多值匹配的问题。这样可以简化查询语句,提高查询性能。

0
0 Comments

MySQL WHERE IN ()的问题出现的原因是在表中或数据库中必须有记录或者数组记录。

解决方法是可以使用子查询,例如:

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

不需要使用子查询也是可以的,例如使用IN (1,2,3,4)是完全有效的。同时,我不理解这是如何解释问题中的"当一条记录有多个id,比如1和3时,MySQL没有返回那行"。

0