mysql获取缺失值

时间:2013-02-23 11:12:50

标签: mysql insert left-join

我知道这是普通的问题,但我需要更多的东西。我有一个关于获取未插入一个表中的值的问题。

好的,这是我的桌子:

  1. name:importantDates; cols:id,date
  2. 名称:插入; cols:id,date,employe_id
  3. 我的问题:如何为每位员工获取缺失值?假设我需要ID = 213的员工缺少插入内容?

    到目前为止,我写了这个,但它还没有工作,就好像一天有一个工人插入一样,它为所有工人消除了一天。

    代码:

    SELECT i.date 
    FROM importantDates i 
       LEFT OUTER JOIN inserts s 
            ON i.date = DATE(s.date) 
    WHERE i.date BETWEEN '2013-1-1' 
        AND '2013-2-23' 
       AND s.date IS NULL;
    

    现在我如何添加对employe_id的检查?

    谢谢你们,如果你需要更多东西,我随时都可以。

    编辑:
    这是样本:
    雇工:
    山姆 迈克
    乔。
    importantDate:
    1. 2013-01-01
    2. 2013-01-02
    3. ...
    40. 2013-02-23

    刀片:
    1. 2013-02-01,1 2. 2013-02-01,2 3. 2013-02-01,3 4. 2013-02-02,3 5. 2013-02-03,1 6. 2013-02-03,2 7. 2013-01-12,1 1

    所以,当我运行查询时,我应该得到所有“缺失”插入。对于每个员工,我应该在缺少插入时获得员工的日期和ID。很多数据,但重要的是要知道哪些未插入,哪些是。

3 个答案:

答案 0 :(得分:0)

而不是LEFT OUTER JOIN使用简单的LEFT JOIN并正确提供日期

SELECT
  i.date
FROM importantDates i
  LEFT JOIN inserts s
    ON i.date = DATE(s.date)
WHERE i.date BETWEEN '2013-01-01'
    AND '2013-02-23'
    AND s.date IS NULL;

答案 1 :(得分:0)

我不太确定我是否理解,你想要实现的目标,但是如果你想从table_a获取不属于table_b的每一行,你可以这样做:< / p>

SELECT * FROM table_a 
WHERE table_a.col NOT IN 
( 
    SELECT col FROM table_b
)

所以(如果我理解你的话)在你的情况下:

SELECT i.date FROM importantDates i 
WHERE i.date NOT IN 
(
    SELECT date FROM inserts WHERE employe_id = 213
) 
AND i.date BETWEEN '2013-01-01' AND '2013-02-23';

有关IN - 子句的更多文档,请参阅mysql documentation

<强>更新

要获得相应的员工, 可以 将声明更改为:

SELECT i.date, e.* FROM importantDates i 
JOIN employees e
WHERE i.date NOT IN 
(
    SELECT s.date FROM inserts s WHERE s.employe_id = e.employe_id
) 
AND i.date BETWEEN '2013-01-01' AND '2013-02-23';

但是,这是 值得推荐,因为子查询是correlated到主查询。

答案 2 :(得分:0)

假设您有一个employee表,请尝试:

select sq.* from
(select e.employe_id, i.date
 FROM importantDates i
 CROSS JOIN employee e
 WHERE i.date BETWEEN '2013-1-1' AND '2013-2-23') sq
LEFT OUTER JOIN inserts s 
  ON sq.date = DATE(s.date) and sq.employe_id = s.employe_id
WHERE s.date IS NULL;

如果您没有单独的employee表,则可以通过将上述查询中的employee更改为:

来模拟一个表。
(select distinct employe_id from inserts) as e