()에있는 MySQL


84

내 질문은 다음과 같습니다.

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

사용자 그룹에 사용하고 사용자는 둘 이상의 그룹에 속할 수 있습니다. 그러나 레코드에 1과 3과 같은 여러 ID가 있으면 mySQL이 해당 행을 반환하지 않는 것 같습니다.

그 행도 얻을 수있는 방법이 있습니까?


7
이 쿼리에서 제대로 반환되지 않는 행의 예를 게시하십시오. 를 id쉼표로 구분 된 목록이나 다른 것으로 저장하지 않는다고 가정하면 쿼리에서 여러 행 반환됩니다.
Michael Berkowski 2011 년

1
예를 들어 => 3,4는 mySQL에 의해 반환되지 않습니다. 문제는 쉼표에 관한 것이지만 어떻게 할 수 있습니까?
netcase 2011 년

1
@ user762683, 적절한 프로필 이름을 사용하십시오. 그리고 this id, varchar 또는 set 또는 enum 의 데이터 유형은 무엇 입니까?
Starx 2012 년

1
@Starx 누군가가 사용하는 프로필 이름은 당신의 어떤 사업입니까?
Michael Berkowski 2011 년

1
@Michael는 쉽고 정확한이 같은 영업 이익에 해당하는 소리를하는 방법을 알아보십시오 netcase대신 @user762683?
Starx 2012 년

답변:


82

귀하의 검색어는

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로 '테이블'에서 모든 레코드를 얻습니다.
BF

39

데이터베이스 디자인이 잘못되어 데이터베이스 정규화에 대해 읽어야합니다 ( wikipedia / stackoverflow ).

나는 당신의 테이블이 다음과 같은 것으로 가정합니다

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 이 있습니다.


1

테이블에 레코드가 있거나 데이터베이스에 배열 레코드가 있어야합니다.

예:

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

하위 선택은 필요하지 않습니다. IN (1,2,3,4)완벽하게 유효합니다. 또한 질문에서 "레코드에 1과 3과 같은 여러 ID가있을 때 mySQL이 해당 행을 반환하지 않습니다"를 설명하는 방법을 이해하지 못합니다.
Scratte
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.