2013-02-23 4 views
0

Я знаю, что это обычный вопрос, но мне нужно что-то еще. У меня проблема с получением значений, которые не вставлены в одну таблицу.mysql Получить недостающие значения

Ok вот мои таблицы:

  1. имя: importantDates; cols: id, date
  2. имя: inserts; cols: id, date, employe_id

Мой вопрос: как получить недостающие значения для каждого работодателя? Предположим, мне нужны отсутствующие вставки из Employe с 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?

Спасибо, ребята, если вам нужно что-нибудь еще, я всегда готов.

EDIT:
Вот пример:
служащий:
1. сэм
2. Майк
3. джо

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

Так что, когда я запускаю запрос, я должен получить все "недостающие" вставки. Для каждого работодателя я должен получить дату и идентификатор сотрудника, когда вставка отсутствует. Много данных, но важно знать, какие из них не вставлены и какие.

+0

ОК, я редактировал мой вопрос. Правильный ответ уже дан, но в случае, если я не был достаточно ясен. – Matjaz

ответ

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 
+0

Это то, что я искал. Можете ли вы сказать мне, откуда вы это взяли, или вы сами написали это? Потому что я нигде не нашел этот пример. О, и у меня есть отдельный стол «employe» :) – Matjaz

+0

@Matjaz: Я сам справился с этим, исходя из требований, которые вы описали. :) –

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

LEFT OUTER JOIN - это то же самое, что и LEFT JOIN - ключевое слово OUTER не является обязательным. –

0

Я не совсем уверен, если я понимаю, что вы пытаетесь достичь, но если вы хотите получить каждая строка из table_a, который не в table_b вы можете сделать это:

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 -clause см mysql documentation

UPDATE:

Чтобы получить соответствующий сотрудник вы может изменить заявление следующим образом:

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.

+0

Эй, ты меня не понял правильно. У меня уже есть это, мне просто нужно добавить еще одно условие для поиска каждого «employe_id» на каждый день. Но спасибо за ответ в любом случае, это еще один способ получить значения, которые еще не вставлены. – Matjaz

+0

А, я думал, вы хотите получить определенного сотрудника по id. Я обновил свой ответ, хотя я не рекомендую его использовать. В этом случае ответ Марка Баннистера может быть лучшим подходом. – Griddo

Смежные вопросы