2014-07-22 3 views
0

의 MySQL의 종류 :나는 3 개 테이블이 조합

CREATE TABLE IF NOT EXISTS `Articles` (
    `id` int(11) NOT NULL DEFAULT '', 
    ... 
    ... 
    PRIMARY KEY (`id_article`) 
) ENGINE=InnoDB ; 

Persons_Articles :

CREATE TABLE IF NOT EXISTS `Persons_Articles` (
    `id_article` int(11) NOT NULL, 
    `id_person` int(11) UNSIGNED NOT NULL, 
    `role` TINYINT(4) UNSIGNED, 
    PRIMARY KEY (`id_article`,`id_person`,`role`) 
) ENGINE=InnoDB ; 

사람 :

CREATE TABLE IF NOT EXISTS `Persons` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `firstname` varchar(64) DEFAULT NULL, 
    `lastname` varchar(64) NOT NULL, 
    `fullname` varchar(128) NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB ; 

INSERT INTO Articles VALUES (1, 'A'), (2, 'B'), (3, 'B'); 
INSERT INTO Persons_Articles VALUES (1, 1, 1); 
INSERT INTO Persons_Articles VALUES (1, 2, 2); 
INSERT INTO Persons VALUES (1, 'Mick', 'Jagger', 'Mick Jagger'); 
INSERT INTO Persons VALUES (2, 'Keith', 'Richards', 'Keith Richards'); 

내가 가진 문서를 반환 할 수 쿼리를 찾아 (fullname = 'Mick Jagger'AND role = 1) AND (fullname = '키스 리차즈 AND 역할 = 2)

아이디어가 있으십니까?

+0

@Torrezzzz, 당신의 의견은 틀린 답을 제시합니다. –

답변

1

시도하고 다음

SELECT a.* 
    FROM articles a 
    JOIN persons_articles pa 
     ON pa.id_article = a.id 
    JOIN persons p 
     ON pa.id_person = p.id 
    AND ((p.fullname = 'Mick Jagger' AND pa.role = 1) OR (p.fullname = 'Keith Richards' AND pa.role = 2)) 
GROUP BY a.id 
    HAVING count(*) = 2; 

UPDATE

A와 : 이것은 당신이 할 수 있다고 가정

SELECT * FROM Persons P 
INNER JOIN Persons_Articles PA ON PA.id_person = P.id 
INNER JOIN Articles A ON A.id = PA.id_article 
WHERE (P.fullname = 'Mick Jagger' AND PA.role = 1) OR (P.fullname = 'Keith Richards' AND PA.role = 2) 
+1

이 쿼리는 작동하는 것 같습니다. 여기에서 확인할 수 있습니다. http://sqlfiddle.com/#!2/22ad0e/2 – lpg

+1

OP는 해당 사람이 모두 해당 역할을 담당하는 기사를 원했을 것으로 생각합니다. . – Arth

+0

@Ipg 바이올린을위한 환호 – Arth

1

이 기사에 대한 중복 (이름 및 역할)를 가지고 사이드 노트, 나는 데이터베이스에 fullname을 저장하지 않을 것입니다. 그것은 UPDATE s와 INSERT s로 더 많은 작업을합니다. 조심하지 않으면 불일치하는 이름으로 끝날 수 있습니다. 약간 더 많은 작업이 있지만 필요에 따라 언제든지 CONCAT() 이름을 사용할 수 있습니다.

+0

아래 투표를 설명해주세요! – Arth

+0

그냥 내 실제 테이블 (70000 기사, 100000 명 ...) 그것을 시도. 결과가 없습니다 – Amoeba

+0

이름과 성이 처음부터 저장되어 있습니다 :-) – Amoeba