2010-01-02 2 views
3

테이블이 2 개 있습니다. 하나는 'page_links'이고 다른 하나는 'rpp'입니다. 테이블 page_links는 테이블 rpp의 상위 집합입니다.(mySQL) 데이터에 대해 2 개의 테이블을 올바르게 쿼리 할 수 ​​없습니다.

다음 내 테이블의 스키마입니다 :

내가 뭘하려고 오전
-- Table structure for table `page_links` 
-- 

CREATE TABLE IF NOT EXISTS `page_links` (
    `page` varchar(255) NOT NULL, 
    `page_link` varchar(100) NOT NULL, 
    `heading_id` tinyint(3) unsigned NOT NULL, 
    PRIMARY KEY (`page`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

-- 
-- Dumping data for table `page_links` 
-- 

INSERT INTO `page_links` (`page`, `page_link`, `heading_id`) VALUES 
('a1.php', 'A1', 8), 
('b1.php', 'B1', 8), 
('c1.php', 'C1', 5), 
('d1.php', 'D1', 5), 
('e1.php', 'E1', 8), 
('f1.php', 'F1', 8), 
('g1.php', 'G1', 8), 
('h1.php', 'H1', 1), 
('i1.php', 'I1', 1), 
('j1.php', 'J1', 8), 
('k1.php', 'K1', 8), 
('l1.php', 'L1', 8), 
('m1.php', 'M1', 8), 
('n1.php', 'N1', 8), 
('o1.php', 'O1', 8), 
('p1.php', 'P1', 4), 
('q1.php', 'Q1', 5), 
('r1.php', 'R1', 4); 


-- Table structure for table `rpp` 
-- 

CREATE TABLE IF NOT EXISTS `rpp` (
    `role_id` tinyint(3) unsigned NOT NULL, 
    `page` varchar(255) NOT NULL, 
    `is_allowed` tinyint(1) NOT NULL, 
    PRIMARY KEY (`role_id`,`page`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

-- 
-- Dumping data for table `rpp` 
-- 

INSERT INTO `rpp` (`role_id`, `page`, `is_allowed`) VALUES 
(3, 'a1.php', 1), 
(3, 'b1.php', 1), 
(3, 'c1.php', 1), 
(3, 'd1.php', 1), 
(3, 'e1.php', 1), 
(3, 'f1.php', 1), 
(3, 'h1.php', 1), 
(3, 'i1.php', 1), 
(3, 'l1.php', 1), 
(3, 'm1.php', 1), 
(3, 'n1.php', 1), 
(4, 'a1.php', 1), 
(4, 'b1.php', 1), 
(4, 'q1.php', 1), 
(5, 'r1.php', 1); 

:

을 내가 (단일 쿼리에서) 위의 두 테이블을 조회하는 것을 시도하고있다 page_links의 모든 페이지가 특정 역할에 대한 rpp의 is_allowed 값과 함께 표시됩니다. 예를 들어, role_id = 3에 대한 모든 페이지의 is_allowed 값을 rpp에서 가져오고 동시에 page_links에서 사용 가능한 모든 페이지를 나열하려고합니다. 내 예상 결과의 명확한 예는 다음과 같습니다

내 원하는 결과의 또 하나의 예는 좌 page_links.page = rpp.page ON RPP 가입하세요 수행하여 달성하지만 할 수
page  is_allowed role_id 
---------------------------------------- 
a1.php 1    3 
b1.php 1    3 
c1.php 1    3 
d1.php 1    3 
e1.php 1    3 
f1.php 1    3 
g1.php NULL   NULL 
h1.php 1    3 
i1.php 1    3 
j1.php NULL   NULL 
k1.php NULL   NULL 
l1.php 1    3 
m1.php 1    3 
n1.php 1    3 
o1.php NULL   NULL 
p1.php NULL   NULL 
q1.php NULL   NULL 
r1.php NULL   NULL 

우리가 ROLE_ID = 3 사용하여 생략 할 필요가 (또는 어떤 가치든지) 그것을 얻을 수 있습니다. 그러나 나는 role_id도 지정하고 결과를 얻고 싶습니다. 이 결과를 얻으려면 쿼리가 필요합니다. 나는 이것으로 나를 도울 수있는 어떤 대답이라도 감사 할 것이다. 원하는 결과를 얻을 수 있도록 테이블 변경 사항을 제안 할 수 있다면 좋을 것입니다. 미리 감사드립니다.

+0

+1 작성 스크립트, 테스트 데이터 및 예상 출력을 제공합니다. 내가 더 줄 수 있으면 좋겠어. –

+0

@ 마크, 감사합니다. 나는 당신의 대답도 받아 들일 수 있었으면 좋겠지 만 그것은 나를 용납하지 않을 것입니다. 어쩌면 다음 번에 .. :) – Devner

답변

1

사용 : 이전

SELECT pl.page, 
      r.is_allowed, 
      r.role_id 
    FROM PAGE_LINKS pl 
LEFT JOIN RPP r ON r.page = pl.page 
       AND OR r.role_id = 3 

:

SELECT pl.page, 
      r.is_allowed, 
      r.role_id 
    FROM PAGE_LINKS pl 
LEFT JOIN RPP r ON r.page = pl.page 
    WHERE r.role_id IS NULL OR r.role_id = 3 

이 쿼리는 3 이외의 ROLE_ID을 가지고 null이되지 않은 페이지를 반환하지 않습니다. 그것은 단지 = 3 ROLE_ID에 해당 페이지를 표시하지 않습니다,

SELECT page_links.page, is_allowed, role_id 
FROM page_links 
LEFT JOIN rpp 
ON rpp.page = page_links.page AND rpp.role_id = 3 
+0

솔루션을 가져 주셔서 감사합니다. 그게 효과가 있었어! – Devner

+0

@OMG : 우리의 솔루션은 다른 결과를 제공합니다. WHERE 절이 일치하지 않기 때문에 q1과 r1이 빠져 있다고 생각합니다. –

+0

@OMG : 고마워요. 쿼리를 확인할 때 제대로 작동했습니다. 아마 나는 그것을 철저히 시험 할 필요가있을 것이다. 나는 여전히 매우 제한된 테스트 데이터로 작업하고 있습니다. 그러나 마가의 해결책에 관한 한, 나는 그 질문을 위해 만들어진 대답 인 것처럼 느꼈다. 감사합니다, OMG, Mark. – Devner

1

이 시도 role_id = 3에 대한 rpp 테이블의 해당 항목 이렇게하면 원하는 결과 세트가 생성됩니다.

+0

안녕하세요, 솔루션을 제공해 주셔서 감사합니다. 당신의 솔루션도 잘 작동했습니다. 귀하의 답변도 수락하려고했지만 이미 선택한 이전 답변을 선택 취소하고 귀하의 답변을 선택하지 않습니다. 나는이 시스템이 나에게 동시에 2 개의 답을 수락하지 못한다고 생각한다. 그러나 나는 당신의 해결책을 얻었고 귀하의 노력에 감사 드리며 따라서 저는 귀하의 답변에 투표했습니다. 감사합니다. – Devner

0
SELECT page_links.page, new_rpp.is_allowed, new_rpp.role_id 
FROM page_links LEFT JOIN (SELECT * FROM rpp where role_id = 3) as new_rpp USING(page) 

이 당신에게 원하는 결과를 얻을뿐만 아니라이없는 모든 페이지를 표시합니다 :

관련 문제