Sql使用having子句连接两个表

时间:2015-10-01 18:25:59

标签: sql left-join

我有两张桌子

First_id | Text    Second_id | First_id | Date | Email

我需要从第一个表中获取所有记录,从第二个表开始计数,日期为null,电子邮件为空。

我有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

最后一列是第二个条目的计数,日期和电子邮件为NULL。我的查询返回

1 | one | 1

没有第二行

2 个答案:

答案 0 :(得分: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 :(得分: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;

解决方案是检查子查询中的HAVING限制,该子查询返回其余连接所需的ID。

使用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