sql - SQL - 从另一个表中选择 * 给定计数
问题描述
我正在尝试使用连接 ( ) 来连接select * from
两个表 (a
和) ,因为 b 中列 ( ) 的计数低于 3,即一个人的名字的出现次数最多为 2。b
column a.id and b.id
b.owner
我试过了:
SELECT a.*, COUNT(b.owner) AS b_count
FROM a LEFT JOIN b on a.id = b.id
GROUP BY b.owner HAVING COUNT(b_count) <3
由于我对 SQL 很陌生,我很困在这里。我该如何解决这个问题?结果应该是在数据中出现不超过两次的所有者的所有列。
解决方案
由于GROUP BY 子句中缺少列,您尝试运行的查询不起作用。
当您从表中输出所有列a
(带有SELECT a.*
)时,您需要在GROUP BY
语句中包含所有这些列,以便数据库了解要分组的字段组并执行所需的聚合(在您的情况下COUNT(b.owner)
)。
例子
考虑到您的表格a
有以下 3 列:
CREATE TABLE persons (
id INTEGER,
name VARCHAR(50),
birthday DATE,
PRIMARY KEY (id)
);
..和你的表b
如下并引用第一个表如下:
CREATE TABLE sales (
id INTEGER,
person_id INTEGER,
sale_value DECIMAL,
PRIMARY KEY (id),
FOREIGN KEY (person_id) REFERENCES persons(id)
);
..您应该查询它聚合COUNT()
这 3 列:
SELECT a.id, a.name, a.birthday, COUNT(b.person_id) AS b_count
FROM persons a
LEFT JOIN sales b ON a.id = b.person_id
GROUP BY a.id, a.name, a.birthday
HAVING COUNT(b.person_id) < 3
选择
如果第二张表上的记录总数对您不重要,您可以在此处使用不同的“策略”来避免JOIN
在表之间执行(在连接两个大表时很有用)并从 + 重写a
所有SELECT
列GROUP BY
。通过首先识别出现次数少于 3 次的记录:
SELECT b.person_id
FROM sales b
GROUP BY b.person_id
HAVING COUNT(b.id) < 3;
.. 并在WHERE
子句中使用它从第一个表中检索所有列,仅用于上一个查询产生的 id:
SELECT a.*
FROM persons a
WHERE a.id IN (....other query here....);
.. 执行以更按时间顺序发生,也许更容易可视化,同时更熟悉 SQL:
SELECT a.*
FROM persons a
WHERE a.id IN (SELECT b.person_id
FROM sales b
GROUP BY b.person_id
HAVING COUNT(b.id) < 3);
DB小提琴在这里
推荐阅读
- python - Mac OS X预装的python2.7中这三个“python”有什么区别?
- laravel - Laravel 从关系中过滤数据
- r - 更改列名时出错,名称的属性 [1] 必须与向量 [0] 的长度相同
- python - Python venv 文件夹究竟是如何工作的?我的项目使用依赖于这个 venv 文件夹使用不同的 Python 版本执行项目?
- mysql - 如何根据另一列中的 IF 参数从 SQL 中的一列创建两列
- javascript - 如何从也具有非数组元素的数组中删除数组元素
- aem - 是否可以通过 QueryBuilder API 根据尺寸搜索图像的再现
- shell - 将表格文件转换为 HTML 表格
- xamarin.forms - WhenAnyValue 没有被 RaisePropertyChanged 调用
- prolog - Prolog - 连接图初学者