【问题标题】:Sql join two tables with having clauseSql 用有子句连接两个表
【发布时间】:2015-10-01 18:25:59
【问题描述】:

我有两张桌子

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)

效果很好,但是我在第二个表中填写了第一个表中的 id 的所有数据和电子邮件,但我没有得到任何结果。

样本数据: 第一张表

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

没有第二行

【问题讨论】:

  • “我需要从第一个表中获取所有记录,其中包含第二个表的计数,日期为空,电子邮件为空。”:我不明白。那么你想准确计算什么?考虑发布示例输入和输出数据以澄清您的问题。

标签: sql left-join


【解决方案1】:

进行左连接,也最好指定要显示的列,否则会出现重复。

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 的计数器
【解决方案2】:
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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-23
    • 1970-01-01
    相关资源
    最近更新 更多