0

これは現在機能しているフィドルへのリンクです。これを行うには、私が見ていないより良い方法があるようです: http://sqlfiddle.com/#!2/396f2/6

--- Sample schema
CREATE TABLE `jobs` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `title` varchar(255) DEFAULT NULL,
  `salary` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
);

CREATE TABLE `people` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
);

CREATE TABLE `people_jobs` (
  `pid` int(11) NOT NULL DEFAULT '0',
  `jid` int(11) NOT NULL DEFAULT '0',
  PRIMARY KEY (`pid`,`jid`),
  KEY `jid` (`jid`),
  CONSTRAINT `people_jobs_ibfk_1` FOREIGN KEY (`pid`) REFERENCES `people` (`id`),
  CONSTRAINT `people_jobs_ibfk_2` FOREIGN KEY (`jid`) REFERENCES `jobs` (`id`)
);

そして、ここにクエリがあります

SELECT p.name, j.title FROM people p LEFT JOIN
 people_jobs pj ON pj.pid = p.id LEFT JOIN
 jobs j ON j.id = pj.jid WHERE p.id NOT IN
(SELECT p.id FROM people p INNER JOIN
 people_jobs pj ON pj.pid = p.id INNER JOIN
 jobs j ON j.id = pj.jid WHERE j.title = 'Artist');

LEFT JOIN でこれを行う方法はありますか? これが、テーブルに存在しないものを探す通常の方法です。しかし、この場合、存在しないものや特定の仕事に合わないものを探しています。私はたくさんのことを調べましたが、テーブルにない、または特定の条件に一致することに基づいて除外する例を見つけることができませんでした.

アーティストではない人々とそれに関連する仕事 (仕事がない場合は null) のペアを取得したいと考えています。したがって、誰かが 5 つの仕事を持っていて、そのうちの 1 つが「アーティスト」である場合、その人をリストから完全に除外したいと考えています。

4

3 に答える 3

1

必要な結果セット (人々 から people_jobs から仕事へ) を作成し、左結合をpeople_jobs2 回目にします。ここでは、人は同じですが、仕事は常に「アーティスト」です。結果の null 以外の行を除外します。これは、アーティストの仕事をしている人だからです。

例えば

SELECT p.name, j.title
FROM people p
LEFT JOIN (
    people_jobs pj
    JOIN jobs j ON j.id = pj.jid
) ON pj.pid = p.id
LEFT JOIN people_jobs artists ON artists.pid = p.id AND artists.jid = 5
WHERE artists.pid IS NULL

これは、アーティストのジョブ ID を事前に知っている (または取得できる) こと、およびそれが5. そうでない場合は、別のネストされた結合またはサブクエリを実行して、名前でジョブを検索できます。

于 2013-10-28T23:06:29.643 に答える
1

ネストされたサブクエリなしでクエリを使用してアーティストを除外する方法についてはわかりませんが、小さな最適化は、サブクエリ内の人への不要な結合を削除することです.

SELECT p.name, j.title 
  FROM people p 
  LEFT JOIN people_jobs pj ON pj.pid = p.id 
  LEFT JOIN jobs j ON j.id = pj.jid 
 WHERE p.id NOT IN
   (SELECT pj.pid 
      FROM people_jobs pj 
     INNER JOIN jobs j ON j.id = pj.jid 
     WHERE j.title = 'Artist')
于 2013-10-28T23:16:13.190 に答える