首页 > 解决方案 > SQL - 从另一个表中选择 * 给定计数

问题描述

我正在尝试使用连接 ( ) 来连接select * from两个表 (a和) ,因为 b 中列 ( ) 的计数低于 3,即一个人的名字的出现次数最多为 2。bcolumn a.id and b.idb.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 很陌生,我很困在这里。我该如何解决这个问题?结果应该是在数据中出现不超过两次的所有者的所有列。

标签: 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所有SELECTGROUP 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小提琴在这里


推荐阅读