如何显示 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
以下是架构和设置脚本:
- tiposUF: 需缴纳费用的单位类型
- rubros:费用类型,我将其归入标题
- tipoUFRubros: M:N link 单位类型 (
tiposUF
) 和标题 (rubros
)
- gastos: 消费记录
-- 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
子句对该集合的聚合函数应用过滤条件。在这种情况下,您只需要 Have 的 COUNT
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
我需要出示公寓(单元)的费用清单。有些公寓会分摊所有费用,而有些公寓只会分摊一部分费用。我需要将哪些贡献分开。
查看此 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 |
以下是架构和设置脚本:
- tiposUF: 需缴纳费用的单位类型
- rubros:费用类型,我将其归入标题
- tipoUFRubros: M:N link 单位类型 (
tiposUF
) 和标题 (rubros
) - gastos: 消费记录
-- 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
子句对该集合的聚合函数应用过滤条件。在这种情况下,您只需要 Have 的 COUNT
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 |