2016-04-15 47 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;