【问题标题】:Count rows that are not in another table计算不在另一个表中的行
【发布时间】:2019-08-07 05:27:54
【问题描述】:

我有以下表格用于管理哪个配置文件已用于什么服务。

个人资料表

CREATE TABLE public.profile
(
    id integer NOT NULL DEFAULT nextval('profile_id_seq'::regclass),
    name text COLLATE pg_catalog."default" NOT NULL,
    CONSTRAINT profile_id PRIMARY KEY (id)
)

服务表

CREATE TABLE public.service
(
    id integer NOT NULL DEFAULT nextval('service_id_seq'::regclass),
    name text COLLATE pg_catalog."default" NOT NULL,
    CONSTRAINT service_id PRIMARY KEY (id)
)

用过的表

CREATE TABLE public.used
(
    id integer NOT NULL DEFAULT nextval('used_id_seq'::regclass),
    service_id bigint NOT NULL,
    profile_id bigint NOT NULL,
    insert_timestamp timestamp with time zone NOT NULL DEFAULT now(),
    CONSTRAINT used_id PRIMARY KEY (id),
    CONSTRAINT used_profile_id_fkey FOREIGN KEY (profile_id)
        REFERENCES public.profile (id) MATCH SIMPLE
        ON UPDATE CASCADE
        ON DELETE CASCADE,
    CONSTRAINT used_service_id_fkey FOREIGN KEY (service_id)
        REFERENCES public.service (id) MATCH SIMPLE
        ON UPDATE CASCADE
        ON DELETE CASCADE
)

我正在尝试创建一个 SQL 查询,该查询将计算 profile_id 不在特定服务的 used 表中的配置文件总数。假设我们的服务名为“gym”,我如何计算不在已使用表中的服务名称为“gym”的配置文件的数量?

【问题讨论】:

  • 您是否尝试过编写查询?

标签: sql postgresql


【解决方案1】:

首先,您需要将used 表与service 表连接起来,以访问每个used 记录的service text。然后你需要添加service text等于gym的条件,最后使用not in条件你可以选择提供的子查询中不存在的配置文件的数量。

select count(*) from public.profile
where id not in
(select u.profile_id from public.used u inner join public.service s
 on s.id = u.service_id
where s.text = 'gym')

【讨论】:

    猜你喜欢
    • 2021-07-22
    • 2015-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多