2016-02-15 171 views
0

我正在使用5个表格进行查询,使用LEFT JOIN连接它们,并将一些结果与GROUP_CONCAT分组。MySQL GROUP_CONCAT返回重复的值。无法使用DISTINCT

的问题是,GROUP_CONCAT结果被复制在此列:

pedido_lentes 
pedidos_lente_quantidades 
pedidos_lente_solares 
pedido_armacoes 
pedidos_armacao_codigos 
pedidos_armacao_tipos 

这里是SQL小提琴:http://sqlfiddle.com/#!9/efc27e/2

下面是该查询:

SELECT 
pedidos.id_pedido AS id_pedido, lentes, armacao, pedidos.observacao AS observacao, 
valor, pagamento, sinal, parcelas, restante, tipo_pagamento, forma_pagamento, DATE_FORMAT(data, "%e/%m/%Y - %H:%i:%s") AS data, entrega, 
vendedor_pedidos, agendar_servico, 

receitas.receita AS receita, 

GROUP_CONCAT(lentes.nome) AS pedido_lentes, 
GROUP_CONCAT(pedidos_lentes.quantidade) AS pedidos_lente_quantidades, 
GROUP_CONCAT(pedidos_lentes.solar) AS pedidos_lente_solares, 

GROUP_CONCAT(armacoes.nome) AS pedido_armacoes, 
GROUP_CONCAT(pedidos_armacoes.codigo) AS pedidos_armacao_codigos, 
GROUP_CONCAT(pedidos_armacoes.tipo) AS pedidos_armacao_tipos 

FROM pedidos 
JOIN receitas ON receitas.id_receita = pedidos.id_receita 

LEFT JOIN pedidos_lentes ON pedidos_lentes.id_pedido = pedidos.id_pedido 
LEFT JOIN lentes ON lentes.id_lente = pedidos_lentes.id_lente 

left JOIN pedidos_armacoes ON pedidos_armacoes.id_pedido = pedidos.id_pedido 
left JOIN armacoes ON armacoes.id_armacao = pedidos_armacoes.id_armacao 

WHERE pedidos.id_cliente = 5353 
GROUP BY pedidos.id_pedido 
ORDER BY pedidos.data DESC 

我期待什么:

| id_pedido |   lentes |   armacao | observacao | valor | pagamento | sinal | parcelas | restante | tipo_pagamento | forma_pagamento |     data | entrega | vendedor_pedidos | agendar_servico | receita |               pedido_lentes | pedidos_lente_quantidades | pedidos_lente_solares |    pedido_armacoes | pedidos_armacao_codigos | pedidos_armacao_tipos | 
    |-----------|----------------|------------------|------------|--------|-----------|--------|----------|----------|----------------|-----------------|-----------------------|---------|------------------|-----------------|------------|-----------------------------------------------------------------------|---------------------------|-----------------------|-------------------------------|-------------------------|-----------------------| 
    |  9561 |   (null) |   (null) |  Teste | 20,00 | à vista |  |  0 |   |  efetuado |  dinheiro | 15/02/2016 - 13:12:05 | avisar |  webmaster |   (null) | 24/12/2014 | Orma Crizal Easy,Orma Crizal Forte |     10,3 |    1,0,1,0 | Flair,Blacktop |    2,33 |    1,1 | 
    |  7448 | teste de lente | teste de armação |   | 200,00 | parcelado | 100,00 |  10 | 10,00 |  na entrega |   Visa | 8/04/2015 - 11:07:36 | avisar |  webmaster |   (null) | 24/12/2014 |                (null) |     (null) |    (null) |      (null) |     (null) |    (null) | 
+0

请您查询和数据复制到网站 – sagi

+2

为什么你不能用'DISTINCT'? –

+0

@JoachimIsaksson因为上面列出的值的数量需要相等。 – marcelo2605

回答

0

DISTINCTGROUP_CONCAT()一个选项:

GROUP_CONCAT(DISTINCT lentes.nome) AS pedido_lentes, 
GROUP_CONCAT(DISTINCT pedidos_lentes.quantidade) AS pedidos_lente_quantidades, 
GROUP_CONCAT(DISTINCT pedidos_lentes.solar) AS pedidos_lente_solares, 

GROUP_CONCAT(DISTINCT armacoes.nome) AS pedido_armacoes, 
GROUP_CONCAT(DISTINCT pedidos_armacoes.codigo) AS pedidos_armacao_codigos, 
GROUP_CONCAT(DISTINCT pedidos_armacoes.tipo) AS pedidos_armacao_tipos 

虽然通常是最简单的方式来解决这些问题,它确实表明,笛卡尔产品由于加入发生。通常,在进行连接之前预先聚合数据会更高效。

+0

据我了解,这并不能解决''因为上面列出的值的数量需要与注释中的值相等。 –

+0

@JoachimIsaksson。 。 。其实,正如我理解的问题和意见,“DISTINCT”正是OP正在寻找的东西。 –

0

在您的聚合器函数中可能包含一些限定符。

你可以说,例如,

GROUP_CONCAT(DISTINCT lentes.nome ORDER BY lentes.id_lente) AS pedido_lentes 

将从该结果不出所料删除重复值nome和订单他们。一探究竟。 http://sqlfiddle.com/#!9/efc27e/4/0

请注意:您在滥用非标准的非法MySQL扩展名为GROUP BY。这可能是你麻烦的一部分。请阅读这个。 http://dev.mysql.com/doc/refman/5.7/en/group-by-handling.html

+0

据我了解,这并不能解决“因为上面列出的列中的值的数量需要与评论相同”。 –

+0

@JoachimIsaksson正确。 – marcelo2605

0

找到了解决办法:

SELECT 
pedidos.id_pedido AS id_pedido, lentes, armacao, pedidos.observacao AS observacao, 
valor, pagamento, sinal, parcelas, restante, tipo_pagamento, forma_pagamento, DATE_FORMAT(data, "%e/%m/%Y - %H:%i:%s") AS data, entrega, 
vendedor_pedidos, agendar_servico, 

receitas.receita AS receita, 

lentes1.pedido_lentes, 
lentes1.pedidos_lente_quantidades, 
lentes1.pedidos_lente_solares, 

armacoes1.pedido_armacoes, 
armacoes1.pedidos_armacao_codigos, 
armacoes1.pedidos_armacao_tipos 

FROM pedidos 
JOIN receitas ON receitas.id_receita = pedidos.id_receita 


LEFT JOIN (
SELECT 
id_pedido, 
GROUP_CONCAT(lentes.nome) AS pedido_lentes, 
GROUP_CONCAT(pedidos_lentes.quantidade) AS pedidos_lente_quantidades, 
GROUP_CONCAT(pedidos_lentes.solar) AS pedidos_lente_solares 
FROM pedidos_lentes 
JOIN lentes ON lentes.id_lente = pedidos_lentes.id_lente 
GROUP BY pedidos_lentes.id_pedido 
) lentes1 ON pedidos.id_pedido = lentes1.id_pedido 

LEFT JOIN(
SELECT 
id_pedido, 
GROUP_CONCAT(armacoes.nome) AS pedido_armacoes, 
GROUP_CONCAT(pedidos_armacoes.codigo) AS pedidos_armacao_codigos, 
GROUP_CONCAT(pedidos_armacoes.tipo) AS pedidos_armacao_tipos 
FROM pedidos_armacoes 
JOIN armacoes ON armacoes.id_armacao = pedidos_armacoes.id_armacao 
GROUP BY pedidos_armacoes.id_pedido 
) armacoes1 ON pedidos.id_pedido = armacoes1.id_pedido 

WHERE pedidos.id_cliente = 5353 
GROUP BY pedidos.id_pedido 
ORDER BY pedidos.data DESC