0

基本的に私は2つのテーブルを持っています

articleID 
  1
  2
  3
  4


relatedType | articleID
     3              1
     4              1
     3              2
     4              3
     5              3
     2              4

に関連するレコードがない articleID を選択する必要がありますtype > 3。このデータセットでは、基本的に次のものが必要です。

articleID
2
4

関連する型には 3 と 2 しか含まれていないためです。

私はこのクエリでそれを行います:

SELECT * FROM article 
   WHERE articleID NOT IN (SELECT articleID FROM relatedTable 
                     ^         WHERE type > 3 GROUP BY portalid ) 
                     |
                     |--- NOT IN does the trick!

しかし、このクエリはかなり遅いため、ネストされたクエリは避けたいと思います。ヒントはありますか?

4

3 に答える 3

1

外部結合を使用する

SELECT a.articleID 
FROM article a LEFT OUTER JOIN relatedTable r
 ON (a.articleID = r.articleID and r.relatedType > 3)
WHERE r.articleID IS NULL

訂正: 申し訳ありませんが、タイプが 3 を超える ANY レコードを含む行をリストする要求ではないことに気付きました。JOIN にサブクエリを作成するか、一時テーブルを作成してインデックスを作成し、それからそれに参加します。これらのいずれかが NOT IN サブクエリよりも実際に高速であるかどうかは、MySQL のバージョンと、さらに重要なテーブル サイズと統計に依存します。

于 2013-02-19T22:57:53.497 に答える
1

できるよ

SELECT * FROM article a
 WHERE NOT EXISTS 
 (SELECT NULL FROM relatedTable b WHERE b.type > 3
  AND b.articleID = a.articleID)     

技術的には、目的の結果 ( NOT INNOT EXISTSLEFT JOIN) を達成するための 3 つの方法はすべて同じように動作し (null 不可の列の場合)、通常は同じ実行計画を生成するNOT IN必要があります。かわった)。
また、パフォーマンスの低下についても、元のクエリのせいGROUP BYにします...

于 2013-02-19T22:58:13.263 に答える
0

記事IDだけが必要な場合は、これを試してください:

SELECT 
   articleID
FROM relatedTable
GROUP BY articleID
HAVING MAX(relatedType) <= 3

articleまたは、これをテーブルに結合できます。

于 2013-02-19T23:11:04.060 に答える