2016-02-15 170 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