具有以下表格

CREATE TABLE contacts (
    Id INT NOT NULL AUTO_INCREMENT,
    Name varchar(255) NOT NULL,
    PRIMARY KEY(Id)
);

CREATE TABLE contacts_cstm (
    Id INT NOT NULL AUTO_INCREMENT,
    Id_c INT NOT NULL,
    Department_c varchar(255) NOT NULL,
    PRIMARY KEY(Id)
);

拥有contacts_cstm个这样的数据

Id  Id_c    Department_c
1   1       ^pro^
2   2       ^pro^,^pro^
3   3       ^pro^,^temp^,^pro^

我想对Contact_cstm表中的所有数据进行计数.如果department_c字段的值包括^PRO^,或存在多个^PRO^事件(如第二行),但如果它包含与^PRO^不同的其他项目,则不应参与帐户

对于包含^pro^^pro^,^pro^的寄存器,预期输出为2

我创造了这sqlfiddle

提前谢谢你

推荐答案

你的 struct 没有任何意义.在Department_c中存储以逗号分隔的部门列表显然不是一个好主意(参见Is storing a delimited list in a database column really that bad?),并且需要字符串操作和完整的表扫描才能获得您想要的答案.更糟糕的是,当您已经有Id_c个(假设是从FK到contacts.Id?)时,您已经用一个没有意义的代理PK将这个序列化关系存储在一个单独的表中.

从你的问题中并不能完全清楚你在这里试图做什么,但这个数据似乎更好地用contacts (Id, Name)departments (Id, Name)contact_department (contact_id, department_id)来表示.可以更高效地查询它,因为它可以有效地使用索引,而不需要全表扫描.

也就是说,在您当前的 struct 下,通过消除对外层count(*)的索引扫描,您可以在P.Salmon's answer的基础上略微改进:

SELECT COUNT(*)
FROM contacts_cstm
WHERE REPLACE(REPLACE(department_c, '^pro^', ''), ',', '') = '';

这假设您在contacts_cstm中没有行,其中department_c是空字符串.如果可能出现空字符串,则可以添加排除空字符串的条件:

SELECT COUNT(*)
FROM contacts_cstm
WHERE REPLACE(REPLACE(department_c, '^pro^', ''), ',', '') = ''
AND department_c <> '';

这是一张db<>fiddle美元.

Mysql相关问答推荐

是否有一种方法可以 Select 表中具有特定列值的行,该行还显示phpmyadmin中原始表中的行号?

我如何才能从MySQL过程中获取LARAVEL端的数据?

在MySQL中使用FIRST_VALUE()

如何从MySQL数据库中提取入职第一个月的工作天数?

如何在sql中包含0作为计数?

MySQL - 密码哈希没有预期的格式

仅当 SELECT 语句在 MySQL 中给出空集时才执行 UPDATE 语句

MySQL CHECK 约束以确保记录不使用自动增量 ID 引用自身?

使用sql查找源和最终目的地

在 SQL 中 for each 组返回具有最大值的行,包括具有相同值的行

使用 DISTINCT 时无法从数据库中查询所有数据

按 SQL 删除分组前的重复项

在 SQL 中将列添加为 End_date,间隔为 +100 天

基于 2 列的重复行的 SQL 查询

MYSQL LOAD DATA INFILE 语句适用于工作台,但不适用于 python

MySQL 查询组按日期(12 小时间隔)

如何过滤表格,以便它显示最新的数据?

在 spring-boot jpa hibernate 中 >4<24 后与 Db 的连接终止

是否可以在 macOS 上只安装 mysqldump

MySQL获取两个值之间的随机值