2016-04-15 9 views
3

別のテーブルに存在しない値を取得する必要があります。私はSharesShare_typesテーブルで作業しています。テーブル間に存在しない値を取得するクエリ

現在のところ、私はこれをPHPで扱っていますが、私は常にShare_typesの2,500行をループしていますが、クエリで行の量を解決することは可能だと思います。

ユーザーは現在、このプロセスを経る:

  1. 株式の種類を選択 - Anual share
  2. を抽出することになる年を選択 - 2016
  3. コード2016年まで、全株式を生成します。まだ生成されていない。つまり、存在しない場合は2016の年が生成されます。私のPHPコードは以下のようである、と述べた

// Retrieves always the 2,500~ rows 
$listOfShareTypes = "SELECT user_id, date_start FROM share_types WHERE type = 'Anual share'"; 

foreach($listOfShareTypes as $type) 
{ 
    // Now is where I validate if the share already exists 
    $hasShare = "SELECT COUNT(*) FROM shares WHERE the_year = $yearSelectedByUser, user_id = $type->user_id, share_type_id = $type->id"; 

    if($hasShare == TRUE) 
     continue; 
    else 
     // Create the share.. 
} 

ので、通常は、クエリを経由して私は、クエリで2 selectを行うだろう、別のテーブルに存在しない結果を取得するために、少数の検索の後にはLEFT JOINの使用を指しています。私は私がSQLFiddle上に作成し、この例を見てみると(などのuser_id、share_type_id、年、)いくつかのフィールド

を一致させる必要があるため、これを達成する方法を見当もつかないしかし、結果は次のようになります。

(5, 3, 'Anual', '2015-06-28') 

2016の年を選択したので、この結果で、から2016まで(PHPで)ループする必要があります。

答えて

2

join条件で間違った列を使用していました。テーブルはuser_idに参加する必要があります。

SQL Fiddle

SELECT stype.id, stype.user_id, stype.type, stype.date_start 
FROM share_types AS stype 
LEFT JOIN shares AS share ON share.user_id = stype.user_id 
WHERE share.share_type_id IS NULL 
+0

このクエリを試みるすべてのこのような場合には、ユーザーが「2017」を選択した場合、それはすべての行を取得する必要があり、私はあなたの答えを受け入れたが、今、私は別の問題に直面しました5行は 'Shares'にまだ追加されていないためです。あなたはどのようにクエリを介してそれを行うには手がかりがありますか? – Linesofcode

+0

いくつかのサンプルデータをフィディルドに追加して、望ましい結果を表示できますか? –

0

SELECT user_id, date_start FROM share_types st,shares sh on sh.share_type_id=st.user_id WHERE type = 'Anual share' and sh.user_id=st.id and sh.the_year=$yearSelectedByUser and Having COUNT(sh.user_id) < 1; 
関連する問題