2

多対多のインデックス テーブルがあり、包含/除外タイプのクエリを実行したいと考えています。

fid は実際には整数インデックスですが、ここでは理解しやすいように文字で示しています。サンプルテーブルは次のとおりです。

タブレット

eid | fid
----+----
1   | A
1   | B
1   | C
2   | B
2   | C
3   | A
3   | C
4   | A
4   | B
5   | B

ここに私が欲しいいくつかのサンプルクエリがあります。

  1. Fid B を持ち、A を持たない eid はどれですか? (eid 2 と 5 に答えてください)
  2. FID C を持ち、A を持たない eid は? (回答 eid 2)

これを行うクエリを理解できないようです。

私はこのような自己結合を試みました:

select * 
from t as t1 
join t as t2 
where t1.eid=t2.eid 
  and t1.fid!=t2.fid 
  and t1.fid=B and t2.fid!=A

eid=1 および fid=C の行が返されるため、これは機能しません。

私は自分が何を望んでいるのか明確ですか?

4

7 に答える 7

7

セット減算を使用する

Select eid from t where fid = 'B' 
EXCEPT
select eid from t where fid = 'A'
于 2008-09-24T19:18:56.010 に答える
3

これは1のクエリの例です(2はほとんど同じように機能します)

select t1.eid
  from t t1
 where t1.fid  = 'B'
   and not exists
       (select 1
          from t t2
         where t2.eid = t1.eid
           and t2.fid  = 'A')
于 2008-09-24T19:25:34.853 に答える
1

副選択を使用できます

tからeidを選択します。ここでfid='C'であり、eidはありません(tからeidを選択します。ここでfid ='A')

于 2008-09-24T19:23:18.947 に答える
0

MySQL 5.0は、NigelとMikeによって説明されているように、存在する場所と存在しない場所をサポートしています。

于 2008-09-24T19:28:24.503 に答える
0

EXISTS を使用するよりも高速なストレート ジョインを含むバージョン:

t1.eidを選択
#test t1 から
        左結合 (
            イードを選択
            #test t2 から
            ここで、fid = 'A'
            イードごとにグループ化
        ) t2.eid の t2 = t1.eid
t1.fid = 'B' の場合
        そして t2.eid は null です
于 2008-09-24T20:03:50.597 に答える
0

サブクエリを使用せずにこれを実行できるはずです。

SELECT DISTINCT t1.eid
FROM table1 AS t1
  LEFT JOIN table1 AS t2 ON (t1.eid = t2.eid AND t2.fid = 'A')
WHERE t2.eid IS NULL
  AND t1.fid = 'B';

2 番目の検索例を実行するには、値 'B' を 'C' に変更します。

于 2008-09-24T20:30:17.990 に答える
0

MINUS 演算子を調べます。UNION が加算する場所を減算する点を除いて、UNION と同じように機能します。「EXCEPT」という単語を含む前の回答は、同じものに対する別のキーワードである可能性があります。

テストされていない答えは次のとおりです。

select eid 
from t
where fid = 'A'
minus
select eid
from t
where fid = 'B'
于 2008-09-24T21:05:17.437 に答える