我有两张桌子
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
没有第二行
答案 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)
查看此图片以了解联接的工作原理:
答案 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