Página 7
| 0002 | 10.99 |
| 0003 | 1.69 |
| 0004 | 19.95 |
+---------+-------+
As filas com grupos de campos de valor máximo
"Para cada artigo, encontre o(s) negociante(s) com o preço mais caro."
No ANSI SQL, pode fazer isto com um sub-query:
SELECT article, dealer, price
FROM shop s1
WHERE price=(SELECT MAX(s2.price)
FROM shop s2
WHERE s1.article = s2.article)
No MySQL é melhor ser feito em vários passos:
1. Obtenha a lista de artigo e preço máximo.
2. Para cada artigo obtenha as filas correspondentes que têm o preço máximo armazenado.
Isto pode ser facilmente feito com uma tabela temporária:
CREATE TEMPORARY TABLE tmp (
article INT(4) UNSIGNED ZEROFILL DEFAULT '0000' NOT NULL,
price DOUBLE(16,2) DEFAULT '0.00' NOT NULL);
LOCK TABLES article read;
INSERT INTO tmp SELECT article, MAX(price) FROM shop GROUP BY article;
SELECT article, dealer, price FROM shop, tmp
WHERE shop.article=tmp.article AND shop.price=tmp.price;
UNLOCK TABLES;
DROP TABLE tmp;
Se você usar uma tabela TEMPORÁRIA, você deve também fechar o "tmp" tabela.
"Isto pode ser feito com uma pergunta única?"
Sim, mas pode usar um truque ineficiente que é chamado de "MAX-CONCAT trick":
SELECT article,
SUBSTRING( MAX( CONCAT(LPAD(price,6,'0'),dealer) ), 7) AS dealer,
0.00+LEFT( MAX( CONCAT(LPAD(price,6,'0'),dealer) ), 6) AS price
FROM shop
GROUP BY article;
+---------+--------+-------+ |