programing

쿼리 내부 쿼리에서 "열로" 반환됨

cafebook 2023. 10. 5. 23:32
반응형

쿼리 내부 쿼리에서 "열로" 반환됨

저는 특정 회사별 관리자 수와 함께 모든 회사를 테이블에 나열하는 것을 좋아합니다.

표:

companies
id
name
...

users
id
company_id
...

groups ('id' = 1 has 'name' = admin)
id
name 

users_groups
id
user_id
group_id

모든 '기업'을 나열하자면 이렇게 적습니다.

SELECT companies.name
FROM companies

하나의 특정 '회사'에 있는 'admin'의 번호(지정된 ID)를 얻기 위해 다음과 같이 적습니다.

SELECT COUNT (users.id) 
FROM users, companies, users_groups WHERE
users.company_id = companies.id AND 
users_groups.user_id = users.id AND
users_groups.group_id = 1

그렇다면 이 두 문제를 어떻게 병합할 수 있을까요?실패:

SELECT 
  companies.name, 
    (
      SELECT COUNT (users.id) 
      FROM users, companies, users_groups WHERE
      users.company_id = companies.id AND 
      users_groups.user_id = users.id AND
      users_groups.group_id = 1
    ) 
  as admins_in_company
FROM users, companies, users_groups

명시적 조인 구문 및 카운트 사용(불특정...)):

select c.name, count(distinct u.id)
from companies c
inner join users u
  on u.company_id = c.id
inner join users_groups ug
  on ug.user_id = u.id
where ug.group_id = 1
group by c.name

모든 회사의 경우:

select c.name, count(distinct u.id)
from companies c
left join users u
  on u.company_id = c.id
left join users_groups ug
  on ug.user_id = u.id
  and ug.group_id = 1
group by c.name
SELECT c.name, COUNT(DISTINCT u.id) AS num_admins
    FROM groups AS g
    JOIN users_groups AS ug   ON ug.group_id = g.id
    JOIN users AS u           ON u.id = ug.user_id
    JOIN companies AS c       ON c.id = u.company_id
    WHERE g.group_id = 1
      AND g.name = 'admin'
    GROUP BY u.company_id;

필요하신지 여부가 불분명합니다.COUNT(DISTINCT u.id)아니면 간단히COUNT(*).

4개의 표를 볼 순서대로 나열했습니다. (이는 필수 사항이 아니라 사용자가 읽고 생각하기 쉽게 만든 것입니다.)첫번째는groups모든 것을 가지고 있는.(어디에). Then it moves through the other tables all the way to getting thecompany.name. Then the그룹화 기준and itsCOUNT(DISTINCT...)'가 적용됩니다.

많은 정보: 많은 스키마(users_groups) 디자인: http://mysql.rjweb.org/doc.php/index_cookbook_mysql#many_to_many_mapping_table

groups-- group_idandgroup.nameare in a 1:1 relationship, yes? If you know that it isgroup_id = 1, you can get rid of the table무리completely from the query. If not, then be sure to have해당 표의 INDEX(name)'.

언급URL : https://stackoverflow.com/questions/41693177/query-inside-query-returned-as-a-column

반응형