2013-10-24 6 views
1

일반적으로 MySQL 또는 SQL 전문가에게 미안한 질문이됩니다. 나는 3 개 테이블이 있습니다 등이 게스트, 표준 사용자, 관리자, :여러 테이블에서 MySQL 쿼리에 문제가 발생했습니다.

  • 사용자
  • 페이지
  • 보안을 보안 같이 여러 수준이

정수 값입니다. 따라서 기본적으로 게스트는 0이고 표준은 1, 관리자는 10입니다.

각 사용자는 보안 테이블의 검색을위한 보안 ID를 가지고 있습니다.

각 페이지는 지정된 사용자에게 표시 될 페이지를 조회 할 수있는 보안 ID가 있습니다.

현재 사용자 이름을 사용하여이 사용자가 볼 수있는 페이지를 반환하는 쿼리를 만들고 싶습니다. 따라서 기본적으로 사용자의 보안 수준보다 작거나 같은 보안 수준으로 모든 페이지를 반환합니다. 하지만 각 테이블의 ID를 보안 테이블의 고유 항목에 저장하는 것은 아닙니다.

DB Schema

샘플 데이터 :

사용자 테이블 : users table data

페이지 테이블 :

pages table data을 약자로 내 DB 스키마의 스크린 샷을 첨부

보안 테이블 :

security table data

+0

그렇게 security.level가있다이 <= 무엇을 열 어떤 테이블에있을하려고? – Mihai

+1

페이지의 보안 수준은 사용자의 보안 수준보다 낮아야합니다. 그러나 페이지 및 사용자의 테이블에는 보안 수준이 아니라 보안 수준이 저장되며 보안 수준은 각 테이블의 ID로 조회됩니다. 관계형 DB를 모듈화하고 일관되게 유지하려고하는 구조를 수정할 수 있습니다. –

답변

0
SELECT p.name FROM users u JOIN security s ON u.security_id=s.id 
     JOIN pages p ON s.id=p.security_id where u.username='currentUser' 
AND (SELECT level from security s JOIN users u on s.id=u.security_id where u.username='currentUser' GROUP BY level) >= (SELECT level from security s JOIN pages p on s.id=p.security_id JOIN users u on s.id=u.security_id where u.username='currentUser' GROUP BY level) 
+0

분명히해야하지만 이것은 보안 ID를 기반으로 합니다만, 보안 테이블의 내부는 레벨 int 값입니다. 보안 수준이 사용자의 현재 보안 수준보다 작거나 같은 모든 페이지를 반환하고 싶습니다. –

+0

사용자의 보안 수준은 어디에 있습니까? – Mihai

+0

보안 테이블 내부에 레벨이 저장됩니다. users 테이블은 나중에 다른 보안 레벨이 추가되는 경우 레벨이 아닌 ID를 저장합니다. 그래서 기본적으로 사용자는 보안 테이블에 ID 인 security_id를 저장하지만 보안 테이블에서는 레벨이 저장됩니다. –

0

select 
    p.name 
from 
    pages p, 
    security s, 
    users u 
where u.security_id = s.id 
    and p.security_id = s.id 
    and u.username = 'someuser' 
+0

그러면 동일한 ID를 가진 모든 페이지가 다시 반환되지만 security.level을 기반으로 사용자가 볼 수있는 페이지 목록을 반환하려고합니다. 따라서 반환 된 페이지는 <= 사용자의 security.level이며 security.id가 아니라면 –

+0

도움이되는지 질문을 수정했습니다. 감사! –

관련 문제