MySQL WHERE IN ()

后端 未结 3 1344
感情败类
感情败类 2020-11-28 07:31

My query is:

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

I use it for usergroups and a user can be in more than one group. but it seems that

3条回答
  •  时光取名叫无心
    2020-11-28 08:13

    You have wrong database design and you should take a time to read something about database normalization (wikipedia / stackoverflow).

    I assume your table looks somewhat like this

    TABLE
    ================================
    | group_id | user_ids | name   |
    --------------------------------
    | 1        | 1,4,6    | group1 |
    --------------------------------
    | 2        | 4,5,1    | group2 |    
    

    so in your table of user groups, each row represents one group and in user_ids column you have set of user ids assigned to that group.

    Normalized version of this table would look like this

    GROUP
    =====================
    | id       | name   |
    ---------------------
    | 1        | group1 |
    ---------------------
    | 2        | group2 |    
    
    GROUP_USER_ASSIGNMENT
    ======================
    | group_id | user_id |
    ----------------------
    | 1        | 1       |
    ----------------------
    | 1        | 4       |
    ----------------------
    | 1        | 6       |
    ----------------------
    | 2        | 4       |
    ----------------------
    | ...      
    

    Then you can easily select all users with assigned group, or all users in group, or all groups of user, or whatever you can think of. Also, your sql query will work:

    /* 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;
    

    This way it will be also easier to update database, when you would like to add new assignment, you just simply insert new row in group_user_assignment, when you want to remove assignment you just delete row in group_user_assignment.

    In your database design, to update assignments, you would have to get your assignment set from database, process it and update and then write back to database.

    Here is sqlFiddle to play with.

提交回复
热议问题