我正在使用5个表进行查询,使用LEFT JOIN
连接它们,并将某些结果与GROUP_CONCAT
分组。
问题是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 :(得分:0)
DISTINCT
是GROUP_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
尽管通常是解决这些问题的最简单方法,但它确实表明由于连接而发生笛卡尔积。通常,在进行连接之前预先聚合数据会更有效。
答案 1 :(得分:0)
可以在GROUP_CONCAT()
聚合器功能中包含一些限定符。
你可以说,例如,
GROUP_CONCAT(DISTINCT lentes.nome ORDER BY lentes.id_lente) AS pedido_lentes
这将从该结果中删除重复的nome
值,并按可预测的顺序排序。看看这个。 http://sqlfiddle.com/#!9/efc27e/4/0
请注意:您正在滥用GROUP BY
的恶意非标准MySQL扩展。这可能是你麻烦的一部分。请阅读这个。 http://dev.mysql.com/doc/refman/5.7/en/group-by-handling.html
答案 2 :(得分: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