簡體   English   中英

MySQL的結合

[英]MySQL sort of union

我有3張桌子:

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

人物文章:

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角色= 1)和(fullname ='Keith Richards'AND角色= 2)的文章

有任何想法嗎 ?

嘗試執行以下操作:

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)

假設您不能重復輸入文章(名稱和角色):

  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;

更新

附帶說明一下,我永遠不會將全名存儲在數據庫中。這會導致使用UPDATEINSERT進行更多工作,如果不小心,可能會導致名稱不匹配。 盡管工作量稍大,但是如果需要,您可以始終使用CONCAT()名稱。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM