programing

SQL - 배수 값 필드에서 선택

goodcopy 2022. 11. 6. 10:39
반응형

SQL - 배수 값 필드에서 선택

Teampass를 사용하고 있습니다.테이블 스키마의 최소화된 예를 다음에 나타냅니다.

Teampass_Roles_Title:

+----+----------------------+
| id | title                |
+----+----------------------+
|  1 | Title 1              |
|  2 | Title 2              |
|  3 | Title 3              |
|  4 | Title 4              |
|  5 | Title 5              |
|  6 | Title 6              |
  ...
+----+----------------------+

및 Teampass_Users

+------------+------------------------------------------------------------+
| login      | fonction_id                                                |
+------------+------------------------------------------------------------+
| AAA        |                                                            |
| BBB        |                                                            |
| CCC        | 12;21;                                                     |
| DDD        | 3;4;5;6;7;8;9;14;15;                                       |
| EEE        | 3;7;                                                       |
| FFF        | 3;7;                                                       |
| GGG        | 3;4;5;6;7;8;9;14;15;21;                                    |
| HHH        | 3;4;5;6;7;8;9;14;15;21;                                    |
  ...
+------------+------------------------------------------------------------+

의 숫자fonction_id테이블의 ID입니다.Teampass_Roles_Title중간 테이블을 사용하는 대신 이 모델을 선택했습니다.예를 들어, 액세스 할 수 있는 모든 유저의 리스트가 있는지 어떤지는 알 수 없습니다.Title 6

+------------+------------------------------------------------------------+
| login      | fonction_id                                                |
+------------+------------------------------------------------------------+
| DDD        | 3;4;5;6;7;8;9;14;15;                                       |
| GGG        | 3;4;5;6;7;8;9;14;15;21;                                    |
| HHH        | 3;4;5;6;7;8;9;14;15;21;                                    |
  ...
+------------+------------------------------------------------------------+

이것은 매우 나쁜 데이터 모델입니다.때때로, 우리는 다른 사람들의 정말 나쁜 결정들에 사로잡힌다.사용하고 싶은 것을 사용할 수 있습니다.find_in_set()그리고.replace():

where find_in_set(6, replace(function_id, ';', ',')) > 0

아무리 좋게 말해도 데이터베이스 모델은 좋지 않다.필요한 작업을 수행할 수 있는 쿼리는 다음과 같습니다.

select
  u.*
from Teampass_Roles_Title t
join Teampass_Users u on u.fonction_id like concat('', t.id, ';%')
                      or u.fonction_id like concat('%;', t.id, ';%')
where t.title = 'Title 6'

다만, 자원 사용의 관점에서는 최적인 것은 아닙니다.데이터베이스 모델을 수정하지 않는 한 다른 방법이 없습니다.

오퍼레이터와 함께LIKE:

select * from Teampass_Users
where 
  concat(';', fonction_id, ';') 
  like 
  concat('%;', (select id from Teampass_Roles_Title where title = 'Title 6'), ';%')

데모를 참조해 주세요.
결과:

| login | fonction_id             |
| ----- | ----------------------- |
| DDD   | 3;4;5;6;7;8;9;14;15;    |
| GGG   | 3;4;5;6;7;8;9;14;15;21; |
| HHH   | 3;4;5;6;7;8;9;14;15;21; |

또, 이 명령어를 변경할 수도 있습니다.LIKE이것처럼.

where function_id like '%;%6%;%' or function_id like '6%;%'

언급URL : https://stackoverflow.com/questions/60776304/sql-selecting-from-a-multiples-values-field

반응형