SQL get field from row with max / min field

时间:2017-11-20 02:08:37

标签: mysql sql

So there is school project and I completely stuck on last step. There's my code:

SELECT Consumidor.numero, Soma.soma
FROM Consumidor
JOIN
  (SELECT compra.consumidor, SUM(Eco.eco*compra.quantidade) as soma
   FROM compra
   JOIN
    (SELECT composto.produto, composto.prodMarca, Produto.nome, 
    sum(Elemento.pegadaEcologica * composto.percentagem/100) AS eco
    FROM composto
    JOIN Produto
    ON composto.produto = Produto.codigo
    AND composto.prodMarca = Produto.marca 
    JOIN Elemento
    ON composto.elemento = Elemento.codigo
    GROUP BY composto.produto, composto.prodMarca) Eco
   ON compra.produto = Eco.produto AND compra.prodMarca = Eco.prodMarca
   GROUP BY compra.consumidor) Soma
ON Consumidor.numero = Soma.Consumidor

So now I have table like:

Consumidor.number Soma.soma 
123               90
456               70
789               70

Expected result should be Consumidor.number (-s) where Soma.soma is min.

I.e. for this table result should be:

Consumidor.number
456     
789

There's original schema for all tables used in this query:

Consumidor (PK numero, email, sexo, nascimento)
Elemento (PK codigo, nome, pegadaEcologica, saude)
Produto (PK codigo, FK PK Marca.numero marca, nome, tipo, comercioJusto)
compra (FK PK Produto.codigo produto, FK PK Produto.marca prodMarca, Consumidor.numero, quantidade)
composto (FK PK Produto.codigo produto, FK PK Produto.marca prodMarca, FK PK Elemento.codigo elemento, percentagem)

Update. I didnt stuck with solution - there is solution:

SELECT Consumidor.numero, Soma.soma
FROM Consumidor
JOIN
  (SELECT compra.consumidor, SUM(Eco.eco*compra.quantidade) as soma
   FROM compra
   JOIN
    (SELECT composto.produto, composto.prodMarca, Produto.nome, 
    sum(Elemento.pegadaEcologica * composto.percentagem/100) AS eco
    FROM composto
    JOIN Produto
    ON composto.produto = Produto.codigo
    AND composto.prodMarca = Produto.marca 
    JOIN Elemento
    ON composto.elemento = Elemento.codigo
    GROUP BY composto.produto, composto.prodMarca) Eco
   ON compra.produto = Eco.produto AND compra.prodMarca = Eco.prodMarca
   GROUP BY compra.consumidor) Soma
ON Consumidor.numero = Soma.Consumidor
WHERE Soma.soma <= ALL
  (SELECT SUM(Eco.eco*compra.quantidade) as soma
   FROM compra
   JOIN
    (SELECT composto.produto, composto.prodMarca, Produto.nome, 
    sum(Elemento.pegadaEcologica * composto.percentagem/100) AS eco
    FROM composto
    JOIN Produto
    ON composto.produto = Produto.codigo
    AND composto.prodMarca = Produto.marca 
    JOIN Elemento
    ON composto.elemento = Elemento.codigo
    GROUP BY composto.produto, composto.prodMarca) Eco
   ON compra.produto = Eco.produto AND compra.prodMarca = Eco.prodMarca
   GROUP BY compra.consumidor)

Simply put whole Soma query onto WHERE clause. With this im getting expected resault. But this looks so ugly and im looking for some more elegant way.

P.S. Don't throw tomatoes - following project statement I'm not able to use sub-queries in FROM clause, but if there are some observations about whole my code I will appreciate.

1 个答案:

答案 0 :(得分:-1)

所以没有其他方法可以解决它

SELECT Consumidor.numero
FROM compra
JOIN Consumidor
ON compra.consumidor = Consumidor.numero
JOIN
    (SELECT composto.produto, composto.prodMarca, Produto.nome, 
     sum(Elemento.pegadaEcologica * composto.percentagem/100) AS eco
     FROM composto
     JOIN Produto
     ON composto.produto = Produto.codigo
     AND composto.prodMarca = Produto.marca 
     JOIN Elemento
     ON composto.elemento = Elemento.codigo
     GROUP BY composto.produto, composto.prodMarca) Eco
ON compra.produto = Eco.produto AND compra.prodMarca = Eco.prodMarca
GROUP BY compra.consumidor
HAVING SUM(Eco.eco*compra.quantidade)<= ALL
    (SELECT SUM(Eco.eco*compra.quantidade)
     FROM compra
     JOIN Consumidor
     ON compra.consumidor = Consumidor.numero
     LEFT JOIN Dependente
     ON Dependente.consumidor = Consumidor.numero
     JOIN
        (SELECT composto.produto, composto.prodMarca, Produto.nome, 
         sum(Elemento.pegadaEcologica * composto.percentagem/100) AS eco
         FROM composto
         JOIN Produto
         ON composto.produto = Produto.codigo
         AND composto.prodMarca = Produto.marca 
         JOIN Elemento
         ON composto.elemento = Elemento.codigo
         GROUP BY composto.produto, composto.prodMarca) Eco
     ON compra.produto = Eco.produto
     AND compra.prodMarca = Eco.prodMarca
     GROUP BY compra.consumidor);

要从当前表中获取具有最小值的字段,您必须在HAVING子句中查询整个表(检查当前表中所有组中compras的哪个组的SUM小于或等于所有组中的comp的SUM)。 它可以被标记为任何可能问题的副本。