2016-04-15 42 views
3

我需要檢索另一個表中不存在的值。我正在與SharesShare_types表一起工作。查詢以檢索表間不存在的值

目前,我有這個PHP的工作,但我總是循環遍佈在Share_types的2500〜行,我認爲可以通過查詢來解決行數量。

用戶目前通過這一過程雲:

  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.. 
} 

所以通常情況下,通過查詢沒有在另一個表我會做兩件select在查詢中存在的結果進行檢索,但經過幾次搜索後,它指向使用LEFT JOIN。但是我不知道如何做到這一點,因爲我需要匹配幾個字段(USER_ID,share_type_id,一年等)

看着這個例子,我在SQLFiddle創建的,其結果應該是:

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

並且由於這個結果,並且由於用戶選擇了2016的年份,我應該從2015開始循環(在PHP中),直到2016

回答

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行,因爲它還沒有被添加到'份額'。你有任何線索如何通過查詢做到這一點? – 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;