2017-01-20 5 views
-1

に動作しませんEXISTS、NOT:私はテーブルから結果を取得する必要がありますのtransactionId、ステータスMySQLのクエリは、私は以下の2つの表と列</p> <p>表1を持って適切に

表2をTRANSACTIONID同じトランザクションIDがtable2に存在しない場合は1

table2の同じtransactionidは存在しますが、ステータスが2と異なる場合、table1の行は返されません。

table2の中に同じのtransactionIdが存在する場合、ステータスが2でそのように私は私のウェブサイト

内のエラーを表示することができ、それは表1の行を返す必要がありますが、私はこのことを知っている必要があり、私が現在持っている:

select * from table1 where not exists (select null from table2 
      WHERE table1.transactionid = table2.transactionid AND status <> 2) 

私はそれのtransactionIdがあれば($行優先> orderswitherrors> 0)と表2に誤りがある場合、PHPで私は確認することができますので、このようなもの(それが正常に動作しません)

select *, (select count(*) from table2 where table1.transactionid = table2.transactionid AND status = 2) as orderswitherrors from table1 where not exists (select null from table2 
      WHERE table1.transactionid = table2.transactionid AND status <> 2) 

が必要になります。.. 。

ありがとうございました

答えて

1

私はEXISTSを使用しようとすると自分自身を悩ますと思います。

このクエリでは、Joinを使用してTable1とTable2の両方を結果セットに取得します。左結合を使用するので、Table1の行はTable2に存在しなくても返されます。一致する行がない場合、結果セットはすべてのTable2列に対してNULLを含みます。

両方のテーブルを持つ結果セットを取得したら、これらの行をフィルタリングして、a)Table2の行がないか、(b)行があり、status = 2.

SELECT table1.*, 
      table2.status 
FROM  table1 
LEFT JOIN table2 ON table1.transactionid = table2.transactionid 
WHERE  table2.transactionid IS NULL --Doesn't exist in table2 
OR  table2.status = 2    --Exists in table2 with status 2 
+0

は、私はあなたがあなたの答えの周りにいくつかのより多くのコンテキストを追加喜ばせるために要求することができます。コードのみの回答は理解しにくいです。あなたの投稿にさらに情報を追加することができれば、これはAskerと将来の読者に役立ちます。 – RBT

+0

http://imgur.com/a/dojSZ助けてくれてありがとう、しかし、私はtable2の行のいずれかにステータス1がある場合、結果を返さないようにする必要があります。ありがとう – lorigio

2

あなたは、例えば状態に基づいて状態にトランザクションIDを取得するためにcaseの文と一緒に「参加左」、および表示/非表示のエラーを使用することができます。

SELECT t1.transactionid, 
CASE WHEN t2.status IS NULL THEN 'NOT_EXISTS' 
WHEN t2.status = 2 THEN 'ERROR' 
END AS state 
FROM table1 t1 LEFT JOIN table2 t2 ON t1.transactionid = t2.transactionid 
WHERE t2.status IS NULL OR t2.status = 2 
ORDER BY t1.transactionid; 

はここSQL Fiddleです。

0

あなたは組み合わせてNOT EXISTSEXISTSを使用することができます。

select t1.* 
from table1 t1 
where not exists (select 1 
        from table2 t2 
        where t1.transactionid = t2.transactionid 
       ) or 
     exists (select 1 
       from table2 t2 
       where t1.transactionid = t2.transactionid and 
        status = 2 
      ); 
関連する問題