如何防止MySQL JOIN中的重复结果?

时间:2017-05-07 17:27:17

标签: mysql join

我试图显示特定用户的费用清单。

每笔费用都可以有一个类型。

费用,用户和类型都在不同的表格中。

当我尝试使用JOIN显示列表时,我得到重复的值:

SELECT DISTINCT 
          gastos.gastoID, 
          gastos.userID, 
          tiposPago.tipoPago AS tipo
FROM      gastos
LEFT JOIN tiposPagoGastos
ON        gastos.userID = tiposPagoGastos.userID
LEFT JOIN tiposPago
ON        tiposPagoGastos.tiposPagoID = tiposPago.tiposPagoID
WHERE     gastos.userID = 8

这是我的费用表:

CREATE TABLE gastos(
    gastoID int unsigned not null auto_increment primary key,
    userID int not null,
    fecha char(25) null COMMENT 'en formato timestamp',
    monto int(10) null,
    detalles text null
)ENGINE=InnoDB DEFAULT CHARSET=utf8;

这是我的付款方式表

CREATE TABLE tiposPago(
    tiposPagoID int unsigned not null auto_increment primary key,
    tipoPago varchar(300) null,
    userID int not null,
    detalles text null
)ENGINE=InnoDB DEFAULT CHARSET=utf8;

这是加入付款类型和费用

的表格
CREATE TABLE tiposPagoGastos(
    tiposPagoGastosID int unsigned not null auto_increment primary key,
    gastoID int not null,
    tiposPagoID int not null,
    userID int not null
)ENGINE=InnoDB DEFAULT CHARSET=utf8;

此用户有两种类型的费用:"美国运通"和"签证"

这是我期望的结果:

gastoID -- userID -- tipo   
64 ------- 8  ------ American Express
65 ------- 8  ------ Visa

这是我得到的结果:

gastoID -- userID -- tipo   
64 ------- 8  ------ American Express
65 ------- 8  ------ American Express
64 ------- 8  ------ Visa
65 ------- 8  ------ Visa

如果我添加到查询:GROUP BY gastos.gastoID,这是我得到的结果:

gastoID -- userID -- tipo   
64 ------- 8  ------ American Express
65 ------- 8  ------ American Express

最后一个结果不正确,因为gastoID" 65"应该是签证。

输入信息为:

tiposPago表

tiposPagoID     tipoPago           userID   detalles
1               VISA                8       banco Galicia
2               American Express    8       Santander

tiposPagoGastos表

gastoID     userID  tiposPagoID
64          8         2
65          8         1

如何获得没有重复结果的正确列表?

1 个答案:

答案 0 :(得分:0)

这很有效,我正在使用错误的字段进行JOIN(以防有人帮助某人,有一天,我发布了答案):

=TEXT(your_calc_formula,"hh:mm:ss")