2015-10-01 2 views
0

У меня есть две таблицSql объединить две таблицы с наличием пункта

First_id | Text Second_id | First_id | Date | Email 

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

У меня есть SQL:

Select * from first f join second s on f.id = s.first_id where date is null and email is null group by first_id having(count(s.id) < 10 or count(s.id) = 0) 

Он хорошо работает, но где у меня есть все данные и электронная почта, заполненные на второй таблице для идентификатора из первой таблицы я не получил никакого результата.

Образец данных: Первая таблица

1 | one 
2 | two 

Второй стол

1 | 1 | NULL | NULL 
1 | 1 | 2015-01-01 | NULL 
1 | 2 | 2015-01-01 | NULL 
1 | 2 | 2015-01-01 | NULL 

Я ожидаю, что на выходе:

1 | one | 1 
2 | two | 0 

последний столбец Количество записей из второй с датой и по электронной почте НОЛЬ. Мой запрос возвращает

1 | one | 1 

Нет второго ряда

+0

* «Мне нужно, чтобы получить все записи из первой таблицы, имеющая кол из второй таблицы с указанием даты утратившим электронной почты нулем.» *: Я не понимаю. Итак, что вы пытаетесь точно подсчитать? Рассмотрите возможность размещения пробных данных ввода и вывода для уточнения вашего вопроса. – sstan

ответ

2

сделать левое соединение, также хорошо, чтобы указать, какие столбцы вы хотите, чтобы показать, в противном случае вы получите дубликаты.

Select * from first f left join second s on f.id = s.first_id where date is null and email is null group by first_id having(count(s.id) < 10 or count(s.id) = 0) 

Заканчивать эту картину, чтобы понять, как присоединиться работы:

http://i.stack.imgur.com/udQpD.jpg

+1

для изображения +1 (awesome venn diagrams) –

+0

это нормально, но он не показывает счетчик с количеством строк = 0 – Chris

0
SELECT t1.First_id, t2.Second_id 
FROM t1 
LEFT JOIN t2 
ON t1.First_id = t2.First_id 
INNER JOIN (
    SELECT Second_id 
    FROM t2 
    GROUP BY Second_id 
    HAVING (COUNT(*) < 10 OR COUNT(*) = 0) 
) _cc 
ON t.Second_id = _cc.Second_id 
WHERE t2.date IS NULL AND t2.email IS NULL; 

Решение состоит в том, чтобы проверить ИМЕЯ ограничения в подзапрос, который возвращает идентификаторы, необходимые для остальных объединений ,

Когда вы используете оператор GROUP BY, полезно выбрать только столбец GROUP BY или агрегатную функцию, иначе вы можете получить непредсказуемые результаты.

https://dev.mysql.com/doc/refman/5.1/en/group-by-handling.html

T-SQL GROUP BY: Best way to include other grouped columns

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