2014-07-22 22 views
0

我有3個表:MySQL的排序工會

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 ='Keith Richards'AND role = 2)

任何想法?

+0

@Torrezzzz,你的評論表明一個不正確的答案。 –

回答

1

嘗試執行以下操作:

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

這是假設你不能有重複(名稱和角色)的一篇文章:

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

作爲注意,我永遠不會在數據庫中存儲全名。它導致更多的工作與UPDATE s和INSERT s如果你不小心,最後可能會出現不匹配的名字。雖然它的工作稍微多一些,但如果需要的話,你總是可以使用CONCAT()這個名字。

+0

請解釋反對! – Arth

+0

剛剛用我的真實表格(70000篇文章,100000人...)嘗試過。沒有結果 – Amoeba

+0

名字和姓氏自始至終被存儲:-) – Amoeba