如何显示 MySQL 中的所有结果,不包括特定行中多个项目共享的结果?

How to show all results in MySQL excluding the ones that are shared by more than one item in a specific row?

我需要出示公寓(单元)的费用清单。有些公寓会分摊所有费用,而有些公寓只会分摊一部分费用。我需要将哪些贡献分开。

查看此 fiddle 以获得完整演示:http://sqlfiddle.com/#!9/6d508a/1 从以下查询中,我只想查看没有多个 linked 费用单位

的记录
SELECT idGasto, gastos.idRubro, monto, rubros.nombre, GROUP_CONCAT(tiposUF.nombre)
FROM gastos
LEFT JOIN rubros ON gastos.idRubro = rubros.idRubro
LEFT JOIN tipoUFRubros ON gastos.idRubro = tipoUFRubros.idRubro
LEFT JOIN tiposUF ON tipoUFRubros.idTipoUF = tiposUF.idTipoUF
GROUP BY gastos.idGasto

结果:

idGasto idRubro monto nombre GROUP_CONCAT(tiposUF.nombre)
1 6 1000 Reparaciones Departamento
2 4 100 Honorarios Administracion Departamento,Local
3 6 500 Reparaciones Departamento

我想排除带有 idGasto=2 的结果,因为它有多个 linked rubros 记录。

预期结果

idGasto idRubro monto nombre GROUP_CONCAT(tiposUF.nombre)
1 6 1000 Reparaciones Departamento
3 6 500 Reparaciones Departamento

我尝试了以下方法,但这只限制了 linked 的记录,我不必指定特定的 ID

SELECT idGasto, gastos.idRubro, monto, rubros.nombre, GROUP_CONCAT(tiposUF.nombre)
FROM gastos
LEFT JOIN rubros ON gastos.idRubro = rubros.idRubro
LEFT JOIN tipoUFRubros ON gastos.idRubro = tipoUFRubros.idRubro
LEFT JOIN tiposUF ON tipoUFRubros.idTipoUF = tiposUF.idTipoUF
WHERE tiposUF.idTipoUF = 1
AND tiposUF.idTipoUF NOT IN (
    SELECT idGasto
    FROM gastos 
    JOIN tipoUFRubros ON gastos.idRubro = tipoUFRubros.idRubro
    JOIN tiposUF ON tiposUF.idTipoUF = tipoUFRubros.idTipoUF
    WHERE tiposUF.idTipoUF = 2
)
GROUP BY gastos.idGasto

失败的结果: http://sqlfiddle.com/#!9/6d508a/2

idGasto idRubro monto nombre GROUP_CONCAT(tiposUF.nombre)
1 6 1000 Reparaciones Departamento
2 4 100 Honorarios Administracion Departamento
3 6 500 Reparaciones Departamento

以下是架构和设置脚本:

-- List of type of units that have to pay the expenses
CREATE TABLE tiposUF(
    idTipoUF int unsigned not null auto_increment primary key,
    nombre varchar(250) null
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `tiposUF` (`nombre`) VALUES
('Departamento'),
('Local');

-- type of expenses
CREATE TABLE rubros(
    idRubro int unsigned not null auto_increment primary key,
    nombre varchar(250) null
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `rubros` (`nombre`) VALUES
('Impuestos'),
('2'), -- not important
('3'), -- not important
('Honorarios Administracion'),
('5'), -- not important
('Reparaciones');

-- M:N Link between units and expenses
CREATE TABLE tipoUFRubros(
    idTipoUFRubro int unsigned not null auto_increment primary key,
    idRubro int not null,
    idTipoUF int not null
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO tipoUFRubros (idRubro,idTipoUF) VALUES
(1,1),
(2,1),
(3,1),
(4,1),
(5,1),
(6,1),
(2,2),
(3,2),
(4,2);

-- Expenses
CREATE TABLE gastos(
    idGasto int unsigned not null auto_increment primary key,
    idRubro int not null,
    monto int not null
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO gastos (idRubro, monto) VALUES
(6,1000),
(4,100),
(6,500);

在分组结果集中,我们可以使用 HAVING 子句对该集合的聚合函数应用过滤条件。在这种情况下,您只需要 HaveCOUNT of tiposUF.nombre 小于 2 的结果:http://sqlfiddle.com/#!9/6d508a/3

SELECT idGasto, gastos.idRubro, monto, rubros.nombre, GROUP_CONCAT(tiposUF.nombre)
FROM gastos
LEFT JOIN rubros ON gastos.idRubro = rubros.idRubro
LEFT JOIN tipoUFRubros ON gastos.idRubro = tipoUFRubros.idRubro
LEFT JOIN tiposUF ON tipoUFRubros.idTipoUF = tiposUF.idTipoUF
GROUP BY gastos.idGasto
HAVING COUNT(tiposUF.nombre) < 2

结果:

idGasto idRubro monto nombre GROUP_CONCAT(tiposUF.nombre)
1 6 1000 Reparaciones Departamento
3 6 500 Reparaciones Departamento